.Net Core 2.0 MVC标记助手

时间:2018-01-26 03:31:50

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

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

我试图替换此代码:

<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添加了一个文件,并且使用此代码它几乎可以工作,当然我需要一些帮助,将参数传递给标记帮助器,然后处理删除字符串并添加代码。 / p>

帮助代码是:

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());
        }
    }
}

2 个答案:

答案 0 :(得分: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,choose等内容。

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

答案 1 :(得分:0)

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>