2015-08-08 98 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方法中實例化它? –