2015-08-08 97 views
12

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

但是,当创建标签助手时,HTML需要通过C#代码(使用TagBuilder等)创建。对于复杂的标签助手而言,它不如使用Razor语法那么方便。

有什么办法可以让我从Razor页面创建一个自定义标签助手吗?

回答

11

TagHelper s的美妙之处在于你可以用许多不同的方式混合使用C#和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()); 
     } 
    } 
} 

然后你可以写t他以下页面:

@addTagHelper "*, WebApplication1" 

<user id="1234" name="John Doe" /> 

产生:

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

所以HTML辅助实际上并没有被废弃,而是被标记助手补充? –

+2

不能让自己变得更好!是:) –

+0

是否可以从我的页面提供模型(用户),让我们说我的主模型的子模型,而不是在标签助手类的ProcessAsync方法中实例化它? –