【问题标题】:MVC 6 Tag Helpers as Replacement for Editor TemplatesMVC 6 Tag Helpers 作为编辑器模板的替代品
【发布时间】:2015-10-31 23:19:29
【问题描述】:

MVC 6 引入了标签助手作为@Html.EditorFor 的更好替代品。可以创建自定义编辑器模板。也可以创建自定义标签助手。

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

有没有什么方法可以让我从 Razor 页面创建自定义标签助手?

【问题讨论】:

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


    【解决方案1】:

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

    CustomTagHelperTemplate.cshtml

    @model User
    
    <p>User name: @Model.Name</p>
    <p>User id: @Model.Id</p>
    

    你有模型:

    namespace WebApplication1
    {
        public class User
        {
            public string Name { get; set; }
            public int Id { get; set; }
        }
    }
    

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

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

    @addTagHelper "*, WebApplication1"
    
    <user id="1234" name="John Doe" />
    

    生成:

    <p>User name: John Doe</p>
    <p>User id: 1234</p>
    

    【讨论】:

    • 所以 HTML Helpers 实际上并没有被弃用,而是由 Tag Helpers 补充?
    • 我自己再好不过了!是的:)
    • 是否可以从我的页面提供模型(用户),比如说我的主模型的子模型,而不是在标签助手类的 ProcessAsync 方法中实例化它?
    • 这在 ASP.NET Core 1.1 中不起作用。我在您说 partial.WriteTo(writer, _htmlEncoder) 的地方出现错误,因为 WriteTo 需要 System.Text.Encodings.Web.HtmlEncoder 而不是 Microsoft.Extensions.WebEncoders.IHTMLEncoder。如果您将其注释掉并尝试运行它 - 您会得到 InvalidOperationException: Unable to resolve service for type 'Microsoft.Extensions.WebEncoders.IHtmlEncoder' 同时尝试激活 'UserTagHelper'。
    • 这让我想起了 ASP .NET Web 窗体时代,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多