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: linkMicrosoft.AspNetCore.Mvc.TagHelpers 只是 classlib/assembly. 我们也可以通过将项目的结构更改为这样来做同样的事情:

| Sample (sln)
|- CustomTagHelpers.Helpers (classlib)
|-- MarkdownTagHelper.cs (Your code with CustomTagHelpers.Helpers namespace)
|- Sample (mvc project)
...

然后我们可以使用@addTagHelper *, CustomTagHelpers.Helpers.