Input Tag helper refactor

pull/272/head
yekalkan 8 years ago
parent 69b2ab8a44
commit 2acf65ea79

@ -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<TagHelperContent>(() => 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<TagHelperContent>(() => 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<T>(ModelExplorer property) where T : Attribute
protected virtual T GetAttribute<T>(ModelExplorer property) where T : Attribute
{
return property?.Metadata?.ContainerType?.GetTypeInfo()?.GetProperty(property.Metadata.PropertyName)?.GetCustomAttribute<T>();
}
protected virtual List<FormGroupContent> GetFormGroupContentsList(TagHelperContext context)
{
return context.Items[FormGroupContents] as List<FormGroupContent>;
}
}
}

@ -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<DisplayOrder>(TagHelper.AspFor.ModelExplorer);
output.SuppressOutput();
}
var list = context.Items["InputGroupContents"] as List<FormGroupContent>;
protected virtual int GetInputOrder()
{
return GetAttribute<DisplayOrder>(TagHelper.AspFor.ModelExplorer)?.Number ?? 0;
}
if (list != null && !list.Any(igc =>igc.Html.Contains("id=\"" + TagHelper.AspFor.Name.Replace('.', '_') + "\"")))
protected virtual void AddGroupToFormGroupContents(List<FormGroupContent> 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 "<div class=\"" + (isCheckbox ? "form-check" : "form-group") + "\">" + Environment.NewLine + innerContent + Environment.NewLine + "</div>";
}
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 "<label " + checkboxClass + idAttrAsString + ">" + _localizer[label] + "</label>";
return "<label " + checkboxClass + GetIdAttributeAsString(inputTag) + ">"
+ _localizer[label] +
"</label>";
}
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 + "\"" : "";
}
}
}
Loading…
Cancel
Save