razor 页面上不解释自定义标签助手
Custom tag helper isn't interpreted on razor page
我尝试向我的项目添加一个自定义标签助手,将降价文本转换为 html。
对于转换,我尝试同时使用 Makrdig.Markdown 和 CommonMarkConverter.Convert,但没有成功,但我认为问题在于没有通过 razor 页面检测到我的实现。
我的 TagHelper:
using Markdig;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace CustomTagHelpers.Helpers
{
[HtmlTargetElement("markdown")]
public class MarkdownTagHelper : TagHelper
{
[HtmlAttributeName("for-content")]
public ModelExpression Content { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagMode = TagMode.SelfClosing;
output.TagName = "markdown-helper";
var markdown = Content.Model.ToString();
//var html = CommonMarkConverter.Convert(markdown);
var html = Markdig.Markdown.ToHtml(markdown);
output.Content.SetHtmlContent(html);
}
}
我已将其添加到 _ViewImports 文件
@addTagHelper *, CustomTagHelpers.Helpers MarkdownTagHelper
这就是在我看来使用我的标签助手的代码,HelloMarkdown 是位于我的视图模型中链接到当前视图的一个属性,它是一个 public 字符串 [BindProperty]
<markdown for-content="HelloMarkdown"> </markdown>
最后,如果我在浏览器中检查 html 代码,它似乎按字面解释,所以它与代码中的相同:
<markdown for-content="HelloMarkdown"> </markdown>
虽然我想得到类似的东西
<markdown-helper><p><em>Hello World</em></p></markdown-helper>
欢迎使用 Whosebug!
我深入研究了 Adam Freeman 的 ASP.NET Core MVC 2 书,因为我发现您的 _ViewImports.cshtml
声明看起来很奇怪,并且还在 docs 中确认您很可能使用无效那里的语法。
根据文档,它应该是这样的(注意 .
,而不是 space):
@addTagHelper *, MarkdownTagHelper
因为第二个参数应该指向 FQN 或程序集的短名称,然后第一个参数告诉我们要使用给定程序集中的哪个 类。您当前的声明说 "import all classes from the CustomTagHelpers.Helpers
assembly" 不存在(它是一个名称 space)。至于 whitespace 之后的 3ed 部分,老实说我不知道它会如何解释,很可能会被忽略。
您也可以使用这种语法:
@addTagHelper CustomTagHelpers.Helpers, MarkdownTagHelper
但我猜你的意图是第一个,从你的程序集中导入所有助手。
请查收是否有帮助?我想可能是吧。
编辑:
我创建了一个简短的示例来验证,是的 - 这是无效 @addTagHelper
语法的问题。
创建新项目 (dotnet new mvc -o Sample
) 后,为您的标签助手(一个程序集)创建一个库 (dotnet new classlib CustomTagHelpers
),将该库的引用添加到主项目中,我最终有了这个:
| Sample (sln)
|- CustomTagHelpers (classlib)
|-- Helpers (dir)
|--- MarkdownTagHelper.cs (Your code with CustomTagHelpers.Helpers namespace)
|- Sample (mvc project)
...
和_ViewImports.cshtml
文件:
@addTagHelper CustomTagHelpers.Helpers.MarkdownTagHelper, CustomTagHelpers
重建标签助手后可见:
当然你也可以使用@addTagHelper *, CustomTagHelpers
从程序集导入所有类。
默认的 @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
似乎是一个名称 space(docs)? This is actually the name of the dll file (assembly). You can find it here: %USERPROFILE%\.nuget\packages\microsoft.aspnetcore.mvc.taghelpers.0.0\lib\netstandard2.0
or similar directory. Here is the source code for it: link。Microsoft.AspNetCore.Mvc.TagHelpers
只是 classlib/assembly. 我们也可以通过将项目的结构更改为这样来做同样的事情:
| Sample (sln)
|- CustomTagHelpers.Helpers (classlib)
|-- MarkdownTagHelper.cs (Your code with CustomTagHelpers.Helpers namespace)
|- Sample (mvc project)
...
然后我们可以使用@addTagHelper *, CustomTagHelpers.Helpers
.
我尝试向我的项目添加一个自定义标签助手,将降价文本转换为 html。 对于转换,我尝试同时使用 Makrdig.Markdown 和 CommonMarkConverter.Convert,但没有成功,但我认为问题在于没有通过 razor 页面检测到我的实现。
我的 TagHelper:
using Markdig;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace CustomTagHelpers.Helpers
{
[HtmlTargetElement("markdown")]
public class MarkdownTagHelper : TagHelper
{
[HtmlAttributeName("for-content")]
public ModelExpression Content { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagMode = TagMode.SelfClosing;
output.TagName = "markdown-helper";
var markdown = Content.Model.ToString();
//var html = CommonMarkConverter.Convert(markdown);
var html = Markdig.Markdown.ToHtml(markdown);
output.Content.SetHtmlContent(html);
}
}
我已将其添加到 _ViewImports 文件
@addTagHelper *, CustomTagHelpers.Helpers MarkdownTagHelper
这就是在我看来使用我的标签助手的代码,HelloMarkdown 是位于我的视图模型中链接到当前视图的一个属性,它是一个 public 字符串 [BindProperty]
<markdown for-content="HelloMarkdown"> </markdown>
最后,如果我在浏览器中检查 html 代码,它似乎按字面解释,所以它与代码中的相同:
<markdown for-content="HelloMarkdown"> </markdown>
虽然我想得到类似的东西
<markdown-helper><p><em>Hello World</em></p></markdown-helper>
欢迎使用 Whosebug!
我深入研究了 Adam Freeman 的 ASP.NET Core MVC 2 书,因为我发现您的 _ViewImports.cshtml
声明看起来很奇怪,并且还在 docs 中确认您很可能使用无效那里的语法。
根据文档,它应该是这样的(注意 .
,而不是 space):
@addTagHelper *, MarkdownTagHelper
因为第二个参数应该指向 FQN 或程序集的短名称,然后第一个参数告诉我们要使用给定程序集中的哪个 类。您当前的声明说 "import all classes from the CustomTagHelpers.Helpers
assembly" 不存在(它是一个名称 space)。至于 whitespace 之后的 3ed 部分,老实说我不知道它会如何解释,很可能会被忽略。
您也可以使用这种语法:
@addTagHelper CustomTagHelpers.Helpers, MarkdownTagHelper
但我猜你的意图是第一个,从你的程序集中导入所有助手。
请查收是否有帮助?我想可能是吧。
编辑:
我创建了一个简短的示例来验证,是的 - 这是无效 @addTagHelper
语法的问题。
创建新项目 (dotnet new mvc -o Sample
) 后,为您的标签助手(一个程序集)创建一个库 (dotnet new classlib CustomTagHelpers
),将该库的引用添加到主项目中,我最终有了这个:
| Sample (sln)
|- CustomTagHelpers (classlib)
|-- Helpers (dir)
|--- MarkdownTagHelper.cs (Your code with CustomTagHelpers.Helpers namespace)
|- Sample (mvc project)
...
和_ViewImports.cshtml
文件:
@addTagHelper CustomTagHelpers.Helpers.MarkdownTagHelper, CustomTagHelpers
重建标签助手后可见:
当然你也可以使用@addTagHelper *, CustomTagHelpers
从程序集导入所有类。
默认的 @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
似乎是一个名称 space(docs)? This is actually the name of the dll file (assembly). You can find it here: %USERPROFILE%\.nuget\packages\microsoft.aspnetcore.mvc.taghelpers.0.0\lib\netstandard2.0
or similar directory. Here is the source code for it: link。Microsoft.AspNetCore.Mvc.TagHelpers
只是 classlib/assembly. 我们也可以通过将项目的结构更改为这样来做同样的事情:
| Sample (sln)
|- CustomTagHelpers.Helpers (classlib)
|-- MarkdownTagHelper.cs (Your code with CustomTagHelpers.Helpers namespace)
|- Sample (mvc project)
...
然后我们可以使用@addTagHelper *, CustomTagHelpers.Helpers
.