【问题标题】:.Net Core 2.0 MVC Tag Helpers.Net Core 2.0 MVC 标签助手
【发布时间】:2018-01-26 03:31:50
【问题描述】:

我的项目使用 .net core 2.0 MVC,我正在使用 razor,但我需要一些帮助。

我正在尝试替换此代码:

<div class="form-group">
    <label asp-for="Address" class="control-label"></label>
    <input asp-for="Address" class="form-control" />
    <span asp-validation-for="Address" class="text-danger"></span>
</div>

通过一个标签助手,让我可以编写如下内容:

<add-edit-form-group ##Address##></add-edit-form-group>

我已经为文件夹TagHelpers 添加了一个文件,并且使用此代码几乎可以工作,当然我需要一些帮助来将参数传递给标签助手,然后处理删除字符串并添加代码。

帮助代码是:

using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.TagHelpers;
using WebApp.Models;

namespace WebApp.TagHelpers
{
    public class AddEditFormGroupTagHelper : TagHelper
    {

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            StringBuilder html = new StringBuilder();

            html.Append("<div class=\"form-group\">");
            html.Append("<label asp-for=\"Address\" class=\"control-label\"></label>");
            html.Append("<input asp-for=\"Address\" class=\"form-control\" />");
            html.Append("<span asp-validation-for=\"Address\" class=\"text-danger\"></span>");
            html.Append("</div>");

            output.Content.SetHtmlContent(html.ToString());
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    事情没那么简单。我建议研究一些现有标签助手的来源,如InputTagHelper。有一个类似的属性:

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

    这就是捕获要绑定输入的属性。

    此外,您还需要一个IHtmlGenerator,它应该被注入到标签助手中:

    protected IHtmlGenerator generator;
    
    public MyAwesomeTagHelper(IHtmlGenerator generator)
    {
        this.generator = generator;
    }
    

    要实际使用它,您还需要ViewContext 的副本,它可以注入属性:

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }
    

    一切就绪后,您可以执行以下操作来为您的输入、标签等生成代码。

     var input = generator.GenerateTextBox(ViewContext, For.ModelExplorer, For.Name, For.Model, For.Metadata.EditFormatString, null);
    

    但是,使用IHtmlGenerator 并不适合轻松愉快的人。这是相当低级的。此外,您必须准确生成所需的内容。例如,在上面,无论播放的类型如何,您最终都会得到type="text" 的输入。如果您有一个布尔值并且您需要一个复选框,那么您需要调用一个完全不同的生成器方法。这意味着您必须自行确定为哪种类型生成的元素的所有逻辑,包括考虑添加到属性中的 DataTypeAttribute 等内容。

    您可以通过实际从 InputTagHelper 继承您的标签助手来缩短其中的一些工作,但这仍然无法帮助您处理诸如 textareas、选择等之类的事情。

    坦率地说,直到或如果微软提供了一种从其他标签助手中呈现标签助手的方法(目前不可能),我想说尝试为此创建一个标签助手将比它更麻烦和努力值得。如果您只是想减少代码重复,您仍然可以像以前在 MVC 中一样使用编辑器模板,或者通常只使用部分视图。如果您沿着标签助手路线走,那么您在很大程度上是靠自己的。

    【讨论】:

      【解决方案2】:

      1.在类定义前添加[HtmlTargetElement("my-first-tag-helper")]

      2.关于标签助手本身 - 添加标签的名称和模式:

      output.TagName = "CustumTagHelper";  
      output.TagMode = TagMode.StartTagAndEndTag;
      

      3.将标签助手注册到_ViewImports.cshtml文件中:

      @addTagHelper *, CustomTagHelper 
      

      4.现在您可以将其添加到视图中:

      <div class="row">  
          <my-first-tag-helper>  
      
          </my-first-tag-helper>  
      </div>  
      

      【讨论】:

        猜你喜欢
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多