【问题标题】:Asp.Net Core 2 Complex Tag HelperAsp.Net Core 2 复杂标签助手
【发布时间】:2018-10-01 01:47:44
【问题描述】:

我是 Asp.Net Core 的新手,但在使用 Tag Helpers 时遇到问题。

我正在尝试为 2 个场景创建标签助手: - 输入组 - 复选框

当我从一个 asp-for 标签开始时,我构建其他标签没有问题,但我不知道如何构建“智能”标签,例如带有 asp-for 字段和所有验证的输入标签。

这是我正在尝试构建的内容:

输入组

<div class="input-group">
    <input class="form-control" placeholder="Search" type="text" data-val="true" data-val-maxlength="Max value" data-val-maxlength-max="5" id="SearchText" name="SearchText" value="" maxlength="5">
    <span class="input-group-append"><button class="btn btn-light" id="myButtonId" type="button">Search</button></span>
</div>

这就是我现在拥有的:

<div class="input-group">
    <input asp-for="SearchText" class="form-control" placeholder="Buscar" add-on-button="myButtonId" add-on-append="true" />
</div>

这是标签助手

[HtmlTargetElement("input", Attributes = "add-on-button,add-on-append", ParentTag = "div")]
public class TextBoxButtonHelper : TagHelper
{
    public string AddOnButton { get; set; }
    public bool AddOnAppend { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        var tagAddOn = new TagBuilder("span");
        tagAddOn.AddCssClass(AddOnAppend ? "input-group-append" : "input-group-prepend");

        var tagButton = new TagBuilder("button");
        tagButton.Attributes.Add("id", AddOnButton);
        tagButton.Attributes.Add("class", "btn btn-light");
        tagButton.Attributes.Add("type", "button");
        tagButton.InnerHtml.Append(context.AllAttributes["placeholder"]?.Value.ToString());

        tagAddOn.InnerHtml.AppendHtml(tagButton);

        if (AddOnAppend)
            output.PostElement.AppendHtml(tagAddOn); 
        else
            output.PreElement.AppendHtml(tagAddOn);
    }
}

我想要的是这样的:

<input-tag asp-for="SearchText" class="form-control" placeholder="Buscar" button="myButtonId" append="true" />

所以只有一个标签可以生成所有代码,但我不知道如何在标签助手中生成“TextBoxFor”。

复选框 与 chechbox 相同的问题,我只需要从一个标签创建它:

<div class="custom-control custom-control-primary custom-checkbox">
    <input class="custom-control-input" data-val="true" data-val-required="The SearchActive field is required." id="SearchActive" name="SearchActive" type="checkbox" value="true">
    <label class="custom-control-label" for="SearchActive">Solo activos</label>
    <input name="SearchActive" type="hidden" value="false">
</div>

感谢您的帮助...

【问题讨论】:

    标签: asp.net asp.net-core asp.net-core-tag-helpers


    【解决方案1】:

    要针对当前模型评估的表达式。

    [HtmlAttributeName("asp-for")]
    public ModelExpression For { get; set; }
    

    使用命名空间

    using Microsoft.AspNetCore.Mvc.ViewFeatures;
    

    完整代码:

    [HtmlTargetElement("input", Attributes = "add-on-button,add-on-append", 
    ParentTag = "div")]
    public class TextBoxButtonHelper : TagHelper
    {
        public string AddOnButton { get; set; }
        public bool AddOnAppend { get; set; }
    
        public override void Process(TagHelperContext context, TagHelperOutput 
        output)
        {
          //Your code
        }
    
      [HtmlAttributeName("asp-for")]
      public ModelExpression For { get; set; }
    }
    

    【讨论】:

    • 我不明白你是怎么解决这个问题的。在旧的 MVC 5 中,我使用 Html Helper 创建那些“元素组”并避免一直写这么多标签,aspnet 核心的最佳实践是什么?结合使用标签助手和html助手?
    【解决方案2】:

    感谢您的回答,但您提供的解决方案都没有回答我的问题,但有助于找到解决方案。

    这是两者的标签助手,它工作正常,以防有人想使用它。

    带按钮 + 输入的输入组

    我们要找的html是:

    <div class="input-group">
        <input placeholder="Search" class="form-control" type="text" data-val="true" data-val-maxlength="Max" data-val-maxlength-max="5" id="SearchText" name="SearchText" value="" maxlength="5">
        <span class="input-group-append">
            <button class="btn btn-light" id="btnSearch" type="button">Search</button>
        </span>
    </div>
    

    最后的辅助标签是:

    <input asp-for="SearchText" placeholder="Search" add-on-button="btnSearch" add-on-button-text="Search" add-on-button-icon="ti-search" add-on-append="true" class="form-control" />
    

    如您所见,我们可以指示按钮的名称、文本和/或图标(我们可以使用图标、文本或两者来构建按钮),还可以指示按钮是在开头还是在结束。

    这是标签助手:

    [HtmlTargetElement("input", Attributes = "add-on-button,add-on-button-text,add-on-button-icon,add-on-append")]
    public class TextBoxButtonTag : TagHelper
    {
        public string AddOnButton { get; set; }
        public string AddOnButtonText { get; set; }
        public string AddOnButtonIcon { get; set; }
        public bool AddOnAppend { get; set; }
    
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            var tagSpan = new TagBuilder("span");
            tagSpan.AddCssClass(AddOnAppend ? "input-group-append" : "input-group-prepend");
    
            var tagButton = new TagBuilder("button");
            tagButton.Attributes.Add("id", AddOnButton);
            tagButton.Attributes.Add("class", "btn btn-light");
            tagButton.Attributes.Add("type", "button");
    
            if (!string.IsNullOrEmpty(AddOnButtonIcon))
            {
                var tagButtonIcon = new TagBuilder("i");
                tagButtonIcon.Attributes.Add("class", string.Concat("ti-search", string.IsNullOrEmpty(AddOnButtonText) ? "" : " pr-1"));
                tagButtonIcon.Attributes.Add("style", "vertical-align: middle");
                tagButton.InnerHtml.AppendHtml(tagButtonIcon);
            }
    
            tagButton.InnerHtml.AppendHtml(AddOnButtonText);
    
    
            tagSpan.InnerHtml.AppendHtml(tagButton);
    
            output.PreElement.AppendHtml(@"<div class='input-group'>");
            if (AddOnAppend)
                output.PostElement.AppendHtml(tagSpan); 
            else
                output.PreElement.AppendHtml(tagSpan);
            output.PostElement.AppendHtml("</div>");
        }
    }
    

    特别设计的复选框

    我们要找的html是:

    <div class="custom-control custom-control-primary custom-checkbox">
        <input type="checkbox" data-val="true" data-val-required="The SearchActive field is required." id="SearchActive" name="SearchActive" value="true" class="custom-control-input">
        <label class="custom-control-label" for="SearchActive">Only active</label>
        <input name="SearchActive" type="hidden" value="false">
    </div>
    

    最后的辅助标签是:

    <input asp-for="SearchActive" add-on-checkbox="Only active" />
    

    这是标签助手:

    [HtmlTargetElement("input", Attributes = "add-on-checkbox")]
    public class CheckBoxTag : TagHelper
    {
        [HtmlAttributeName("asp-for")]
        public ModelExpression Source { get; set; }
    
        public string AddOnCheckbox { get; set; }
    
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.Attributes.Add("class", "custom-control-input");
    
            var tagLabel = new TagBuilder("label");
            tagLabel.AddCssClass("custom-control-label");
            tagLabel.Attributes.Add("for", Source.Name);
            tagLabel.InnerHtml.Append(AddOnCheckbox);
    
            var tagHidden = new TagBuilder("input");
            tagHidden.Attributes.Add("name", Source.Name);
            tagHidden.Attributes.Add("type", "hidden");
            tagHidden.Attributes.Add("value", "false");
    
            output.PreElement.AppendHtml(@"<div class='custom-control custom-control-primary custom-checkbox'>");
            output.PostElement.AppendHtml(tagLabel);
            output.PostElement.AppendHtml(tagHidden);
            output.PostElement.AppendHtml("</div>");
        }
    }
    

    为了工作,对于这两种情况,您需要指明所有属性。有一种方法可以使这些属性成为可选,但我没有在这里实现。

    我希望这对某人有所帮助,因为我还没有找到任何说明如何做到这一点的文章。

    感谢您的帮助。

    【讨论】:

      【解决方案3】:

      看起来你可以使用 output.Content.SetHtmlContent() - 当然是让复选框踢出大量 html 如此处所述:

      https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring?view=aspnetcore-2.1#pass-a-model-to-a-tag-helper

      【讨论】:

        猜你喜欢
        • 2018-03-31
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多