【问题标题】:MVC 6 .Net Core1 Create Custom tag helper for Likert ScaleMVC 6 .Net Core1 为李克特量表创建自定义标签助手
【发布时间】:2016-04-23 04:26:58
【问题描述】:

我正在尝试使用 .Net Core RC1 为 MVC 6 创建标签助手。我找到了一些不错的sources,但不是很接近,this 是我找到的最接近的,并采用了我认为创建现有代码所需的元素:

首先是我的目标 HTML:

<span class="form-control">
                Highly Disagree
                <input type="radio" name="MakingSense" value=1 />
                <input type="radio" name="MakingSense" value=2 />
                <input type="radio" name="MakingSense" value=3 />
                <input type="radio" name="MakingSense" value=4 />
                <input type="radio" name="MakingSense" value=5 />
                Highly Agree
            </span>

现在我只是想显示一个输入标签。如果我能弄清楚,我将添加一个循环来获取其他人。这是我的 TagHelper

[HtmlTargetElement("input", Attributes = LikertForAttributeName)]
public class LikertTagHelper : TagHelper
{
    private const string LikertForAttributeName = "likert-for";

    [HtmlAttributeName(LikertForAttributeName)]
    public string ModelField { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        var content = new StringBuilder();
        var input = new TagBuilder("input");
        input.MergeAttribute("type", "radio");
        input.MergeAttribute("name", ModelField);
        input.MergeAttribute("value", "1");
        content.AppendLine(input.ToString());
        output.Content.SetContent(content.ToString());
        output.PreContent.SetHtmlContent("<span class=\"form-control\"");
        output.PostContent.SetHtmlContent("</span>");
    }

}

这是我的剃须刀 cshtml:

<input likert-for="CharacterUnderstanding" />

但是,我只得到这个作为我的 html 输出:

<input />

所以它正在拾取标签并处理它,但不像我预期的那样。在我出错的地方提供帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net-core-mvc tag-helpers


    【解决方案1】:

    您的标签助手起点是一个输入标签,因此content 开始成为一个自闭合输入标签。

    你要做的第一件事就是把它变成一个span标签,例如:

    //Replace initial output (an input tag) with a span
    var outerTag = new TagBuilder("span");
    outerTag.AddCssClass("form-control");
    output.MergeAttributes(outerTag);
    output.TagName = outerTag.TagName;
    output.TagMode = TagMode.StartTagAndEndTag;
    

    现在由于输出是一个跨度标签,您可以开始添加内部内容:

    • 非常同意非常不同意标签可以添加为前/后内容(仍在范围内):

      //Add Pre/Post texts
      output.PreContent.SetHtmlContent("Highly Disagree");
      output.PostContent.SetHtmlContent("Highly Agree");
      
    • 单选按钮可以附加到 span 的内容中:

      //Add the radio buttons
      for(var x =0; x<5; x++)
      {
          var input = new TagBuilder("input");
          input.MergeAttribute("type", "radio");
          input.MergeAttribute("name", ModelField);
          input.MergeAttribute("value", x.ToString());
          output.Content.Append(input);
      }
      

    有了这个标签助手,剃刀视图中的以下行:

    <input likert-for="CharacterUnderstanding" />
    

    呈现为:

    <span class="form-control">
        Highly Disagree
        <input name="CharacterUnderstanding" type="radio" value="0">
        <input name="CharacterUnderstanding" type="radio" value="1">
        <input name="CharacterUnderstanding" type="radio" value="2">
        <input name="CharacterUnderstanding" type="radio" value="3">
        <input name="CharacterUnderstanding" type="radio" value="4">
        Highly Agree
    </span>
    

    附带说明,在使用接受字符串的重载添加内容时要小心。在您的原始代码中,content.AppendLine(input.ToString()); 行实际上是附加 Microsoft.AspNet.Mvc.Rendering.TagBuilder 而不是标签生成器内容。

    【讨论】:

    • 感谢您提供详细信息。我想我知道我哪里出错了,当我有几分钟的时间时,我会继续追究。我想我不确定 output.MergeAttributes 在做什么。输出是否有 MergeAttributes?应该是 input.MergeAttribute(key,value) 吗?
    • 作为更新。我能够完成大部分工作,但是,我似乎无法添加 Span CSS 类。所以一切都正确呈现 HTML 但没有跨度类?
    • output.MergeAttributes 使用Microsoft.AspNet.Mvc.TagHelpers 中的扩展方法(假设为RC1)。我正在使用它将表单控制类添加到输出范围,同时还允许在剃刀代码中指定其他属性和类。例如,您可以在剃须刀中拥有&lt;input likert-for="CharacterUnderstanding" class="foo" /&gt;,它将呈现为&lt;span class="foo form-control"&gt;...&lt;/span&gt;。您是否尝试过答案中的代码?对我来说效果很好
    • 知道它只是缺少 TagHelpers 参考。再次感谢代码和清晰的解释。
    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 2013-02-14
    • 2015-08-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多