From 2acf65ea7939917982338a4dc2169c3695b96217 Mon Sep 17 00:00:00 2001 From: yekalkan Date: Tue, 1 May 2018 14:22:00 +0300 Subject: [PATCH] Input Tag helper refactor --- .../TagHelpers/AbpTagHelperService.cs | 29 ++++----- .../Form/AbpInputTagHelperService.cs | 63 +++++++++++-------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs index 597b8be601..00b0a8714e 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs @@ -6,6 +6,7 @@ using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers { @@ -15,7 +16,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers protected const string FormGroupContents = "FormGroupContents"; public TTagHelper TagHelper { get; set; } - + public virtual int Order { get; } public virtual void Init(TagHelperContext context) @@ -34,7 +35,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers return Task.CompletedTask; } - protected TagHelperOutput GetInnerTagHelper(TagHelperAttributeList attributeList, TagHelperContext context, TagHelper tagHelper, string tagName = "div", TagMode tagMode = TagMode.SelfClosing) + protected virtual TagHelperOutput GetInnerTagHelper(TagHelperAttributeList attributeList, TagHelperContext context, TagHelper tagHelper, string tagName = "div", TagMode tagMode = TagMode.SelfClosing) { var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run(() => new DefaultTagHelperContent())) { @@ -48,21 +49,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers return innerOutput; } - protected string RenderTagHelper(TagHelperAttributeList attributeList, TagHelperContext context, TagHelper tagHelper, HtmlEncoder htmlEncoder, string tagName = "div", TagMode tagMode = TagMode.SelfClosing) + protected virtual string RenderTagHelper(TagHelperAttributeList attributeList, TagHelperContext context, TagHelper tagHelper, HtmlEncoder htmlEncoder, string tagName = "div", TagMode tagMode = TagMode.SelfClosing) { - var innerOutput = new TagHelperOutput(tagName, attributeList, (useCachedResult, encoder) => Task.Run(() => new DefaultTagHelperContent())) - { - TagMode = tagMode - }; - - var innerContext = new TagHelperContext(attributeList, context.Items, Guid.NewGuid().ToString()); - - tagHelper.Process(innerContext, innerOutput); + var innerOutput = GetInnerTagHelper(attributeList, context, tagHelper, tagName, tagMode); return RenderTagHelperOutput(innerOutput, htmlEncoder); } - protected string RenderTagHelperOutput(TagHelperOutput output, HtmlEncoder htmlEncoder) + protected virtual string RenderTagHelperOutput(TagHelperOutput output, HtmlEncoder htmlEncoder) { using (var writer = new StringWriter()) { @@ -70,10 +64,17 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers return writer.ToString(); } } - - public static T GetAttribute(ModelExplorer property) where T : Attribute + + protected virtual T GetAttribute(ModelExplorer property) where T : Attribute { return property?.Metadata?.ContainerType?.GetTypeInfo()?.GetProperty(property.Metadata.PropertyName)?.GetCustomAttribute(); } + + protected virtual List GetFormGroupContentsList(TagHelperContext context) + { + return context.Items[FormGroupContents] as List; + } + + } } \ No newline at end of file diff --git a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs index 38b8e8f417..23fc16e1f4 100644 --- a/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs +++ b/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs @@ -27,27 +27,39 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form public override void Process(TagHelperContext context, TagHelperOutput output) { - var inputTag = GetInputTag(context); - var inputHtml = RenderTagHelperOutput(inputTag, _encoder); - var isCheckbox = IsInputCheckbox(inputTag.Attributes); - var label = GetLabelAsHtml(inputTag, isCheckbox); + var html = GetFormInputGroupAsHtml(context, output); + + var order = GetInputOrder(); - var content = GetContent(label, inputHtml, isCheckbox); + AddGroupToFormGroupContents(GetFormGroupContentsList(context), html, order); - var order = GetAttribute(TagHelper.AspFor.ModelExplorer); + output.SuppressOutput(); + } - var list = context.Items["InputGroupContents"] as List; + protected virtual int GetInputOrder() + { + return GetAttribute(TagHelper.AspFor.ModelExplorer)?.Number ?? 0; + } - if (list != null && !list.Any(igc =>igc.Html.Contains("id=\"" + TagHelper.AspFor.Name.Replace('.', '_') + "\""))) + protected virtual void AddGroupToFormGroupContents(List list, string html, int order) + { + if (list != null && !list.Any(igc => igc.Html.Contains("id=\"" + TagHelper.AspFor.Name.Replace('.', '_') + "\""))) { list.Add(new FormGroupContent { - Html = content, - Order = order?.Number ?? 0 + Html = html, + Order = order }); } + } - output.SuppressOutput(); + protected virtual string GetFormInputGroupAsHtml(TagHelperContext context, TagHelperOutput output) + { + var inputTag = GetInputTag(context, out var isCheckbox); + var inputHtml = RenderTagHelperOutput(inputTag, _encoder); + var label = GetLabelAsHtml(inputTag, isCheckbox); + + return GetContent(label, inputHtml, isCheckbox); } protected virtual string GetContent(string label, string inputHtml, bool isCheckbox) @@ -59,7 +71,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form return "
" + Environment.NewLine + innerContent + Environment.NewLine + "
"; } - protected virtual TagHelperOutput GetInputTag(TagHelperContext context) + protected virtual TagHelperOutput GetInputTag(TagHelperContext context, out bool isCheckbox) { var inputTagHelper = new InputTagHelper(_generator) { @@ -68,9 +80,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form }; var inputTagHelperOutput = GetInnerTagHelper(new TagHelperAttributeList(), context, inputTagHelper, "input"); + isCheckbox = IsInputCheckbox(inputTagHelperOutput.Attributes); - inputTagHelperOutput.Attributes.Add("class", - IsInputCheckbox(inputTagHelperOutput.Attributes) ? "form-check-input" : "form-control"); + inputTagHelperOutput.Attributes.Add("class", isCheckbox ? "form-check-input" : "form-control"); return inputTagHelperOutput; } @@ -87,25 +99,26 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form return ""; } - var label = GetLabelText(); - var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id"); - var idAttrAsString = ""; - - if (idAttr != null) - { - idAttrAsString = "for=\"" + idAttr.Value + "\""; - } - + var label = GetLabelValue(); var checkboxClass = isCheckbox ? "class=\"form-check-label\" " : ""; - return ""; + return ""; } - protected virtual string GetLabelText() + protected virtual string GetLabelValue() { return string.IsNullOrEmpty(TagHelper.Label) ? TagHelper.AspFor.Metadata.DisplayName : TagHelper.Label; } + + protected virtual string GetIdAttributeAsString(TagHelperOutput inputTag) + { + var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id"); + + return idAttr != null ? "for=\"" + idAttr.Value + "\"" : ""; + } } } \ No newline at end of file