12
MVC 6引入了Tag Helpers作爲@ Html.EditorFor的更好替代品。可以創建自定義的編輯器模板。也可以創建一個自定義標籤助手。MVC 6 Tag Helpers作爲編輯器模板的替代品
但是,當創建標籤助手時,HTML需要通過C#代碼(使用TagBuilder等)創建。對於複雜的標籤助手而言,它不如使用Razor語法那麼方便。
有什麼辦法可以讓我從Razor頁面創建一個自定義標籤助手嗎?
MVC 6引入了Tag Helpers作爲@ Html.EditorFor的更好替代品。可以創建自定義的編輯器模板。也可以創建一個自定義標籤助手。MVC 6 Tag Helpers作爲編輯器模板的替代品
但是,當創建標籤助手時,HTML需要通過C#代碼(使用TagBuilder等)創建。對於複雜的標籤助手而言,它不如使用Razor語法那麼方便。
有什麼辦法可以讓我從Razor頁面創建一個自定義標籤助手嗎?
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>
所以HTML輔助實際上並沒有被廢棄,而是被標記助手補充? –
不能讓自己變得更好!是:) –
是否可以從我的頁面提供模型(用戶),讓我們說我的主模型的子模型,而不是在標籤助手類的ProcessAsync方法中實例化它? –