MVC 6标记助手作为编辑器模板的替代品

Ser*_*rov 13 asp.net-core-mvc tag-helpers

MVC 6引入了Tag Helpers作为@ Html.EditorFor的更好替代品.可以创建自定义编辑器模板.也可以创建自定义Tag Helper.

但是,在创建Tag Helper时,需要通过C#代码(使用TagBuilder等)创建HTML.对于复杂的Tag Helpers,它不如使用Razor语法那么方便.

有没有什么方法可以让我从Razor页面创建自定义Tag Helper?

N. *_*len 15

TagHelpers 的美妙之处在于你可以用许多不同的方式混合C#和Razor.所以假设您有一个自定义Razor模板,例如:

CustomTagHelperTemplate.cshtml

@model User

<p>User name: @Model.Name</p>
<p>User id: @Model.Id</p>
Run Code Online (Sandbox Code Playgroud)

你有这个模型:

namespace WebApplication1
{
    public class User
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

而且TagHelper:

using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.Framework.WebEncoders;

namespace WebApplication1
{
    public class UserTagHelper : TagHelper
    {
        private readonly HtmlHelper _htmlHelper;
        private readonly IHtmlEncoder _htmlEncoder;

        public UserTagHelper(IHtmlHelper htmlHelper, IHtmlEncoder htmlEncoder)
        {
            _htmlHelper = htmlHelper as HtmlHelper;
            _htmlEncoder = htmlEncoder;
        }

        [ViewContext]
        public ViewContext ViewContext
        {
            set
            {
                _htmlHelper.Contextualize(value);
            }
        }

        public string Name { get; set; }

        public int Id { get; set; }

        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = null;
            output.SelfClosing = false;

            var partial = await _htmlHelper.PartialAsync(
                "CustomTagHelperTemplate",
                new User
                {
                    Name = Name,
                    Id = Id
                });

            var writer = new StringWriter();
            partial.WriteTo(writer, _htmlEncoder);

            output.Content.SetContent(writer.ToString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以编写以下页面:

@addTagHelper "*, WebApplication1"

<user id="1234" name="John Doe" />
Run Code Online (Sandbox Code Playgroud)

哪个产生:

<p>User name: John Doe</p>
<p>User id: 1234</p>
Run Code Online (Sandbox Code Playgroud)

  • 所以HTML Helpers实际上并没有被弃用,而是由Tag Helpers补充? (2认同)
  • 不能自己把它变得更好!是的:) (2认同)
  • 这让我想起了 ASP .NET Web Forms 时代,&lt;asp: 控件(如 asp:TextBox 等)开始发挥作用,你会在 HTML 标记中读取一个东西,然后在 HTML 响应流中得到完全不同的东西. 不好的感觉。当然,我可能完全错了。 (2认同)