如何为剃须刀创建自定义标签助手?
How to create custom tag helpers for razor?
我正在尝试在 MVC 6 中创建自定义标签助手,但无法正常工作。
这是我在 Web 应用程序项目中定义的演示标记助手 class。
namespace Microsoft.AspNet.Mvc.TagHelpers
{
[TargetElement("demo", Attributes = CustomAttributeName)]
public class DemoTagHelper : TagHelper
{
private const string CustomAttributeName = "asp-custom";
[HtmlAttributeName(CustomAttributeName)]
public string Custom { get; set; }
public string Value { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.Attributes["foo"] = "bar";
}
}
}
我的观点是这样使用的:
<demo asp-custom="hello world!">
Please work this time :)
</demo>
我尝试了很多东西。删除了 TargetElement
属性或更改了命名空间。没有什么改变...
结果还是一样。
顺便说一句,我的 Microsoft.AspNet.Mvc.TagHelpers 版本是 6.0.0-beta4.
也许我必须在某个地方注册我的标签助手?我查看了 MVC 源代码,他们没有在任何地方引用他们自己的标签助手。所以我认为不需要注册。
这里的问题在哪里?
您可以通过向 Views 目录中的 _ViewImports.cshtml
文件添加 addTagHelper
指令来为自定义标签启用 TagHelper
处理:
@addTagHelper "*, YourMvcAssembly"
更新
@yilmaz 还需要在评论中添加对 Microsoft.AspNet.Tooling.Razor
的引用。
这是我目前拥有的自定义标签助手,它可以正常工作。我将其更改为针对演示元素。试试看:
namespace TestingTagHelpers.TagHelpers
{
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using System;
/// <summary>
/// <see cref="ITagHelper"/> implementation targeting <demo> elements.
/// </summary>
//[TargetElement("demo")]
public class DemoTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var childContent = context.GetChildContentAsync().Result;
string demoContent = childContent.GetContent();
string demo = context.AllAttributes["asp-custom"].ToString();
output.TagName = "div";
output.Attributes.Clear();
output.Attributes["data-custom"] = demo;
output.Content.SetContent(demoContent);
}
}
}
我正在尝试在 MVC 6 中创建自定义标签助手,但无法正常工作。
这是我在 Web 应用程序项目中定义的演示标记助手 class。
namespace Microsoft.AspNet.Mvc.TagHelpers
{
[TargetElement("demo", Attributes = CustomAttributeName)]
public class DemoTagHelper : TagHelper
{
private const string CustomAttributeName = "asp-custom";
[HtmlAttributeName(CustomAttributeName)]
public string Custom { get; set; }
public string Value { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.Attributes["foo"] = "bar";
}
}
}
我的观点是这样使用的:
<demo asp-custom="hello world!">
Please work this time :)
</demo>
我尝试了很多东西。删除了 TargetElement
属性或更改了命名空间。没有什么改变...
结果还是一样。
顺便说一句,我的 Microsoft.AspNet.Mvc.TagHelpers 版本是 6.0.0-beta4.
也许我必须在某个地方注册我的标签助手?我查看了 MVC 源代码,他们没有在任何地方引用他们自己的标签助手。所以我认为不需要注册。
这里的问题在哪里?
您可以通过向 Views 目录中的 _ViewImports.cshtml
文件添加 addTagHelper
指令来为自定义标签启用 TagHelper
处理:
@addTagHelper "*, YourMvcAssembly"
更新
@yilmaz 还需要在评论中添加对 Microsoft.AspNet.Tooling.Razor
的引用。
这是我目前拥有的自定义标签助手,它可以正常工作。我将其更改为针对演示元素。试试看:
namespace TestingTagHelpers.TagHelpers
{
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using System;
/// <summary>
/// <see cref="ITagHelper"/> implementation targeting <demo> elements.
/// </summary>
//[TargetElement("demo")]
public class DemoTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var childContent = context.GetChildContentAsync().Result;
string demoContent = childContent.GetContent();
string demo = context.AllAttributes["asp-custom"].ToString();
output.TagName = "div";
output.Attributes.Clear();
output.Attributes["data-custom"] = demo;
output.Content.SetContent(demoContent);
}
}
}