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)
| 归档时间: |
|
| 查看次数: |
6041 次 |
| 最近记录: |