【问题标题】:Custom tag helper isn't interpreted on razor page剃刀页面上不解释自定义标签助手
【发布时间】:2020-06-06 15:21:35
【问题描述】:

我尝试在我的项目中添加一个自定义标签助手,它将降价文本转换为 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 是位于我的视图模型中的一个属性,链接到当前视图,它是一个带有 [BindProperty] 的公共字符串

<markdown for-content="HelloMarkdown"> </markdown>

最后,如果我在浏览器中检查 html 代码,它似乎是按字面意思解释的,所以它与代码中的相同:

<markdown for-content="HelloMarkdown"> </markdown>

虽然我想得到类似的东西

<markdown-helper><p><em>Hello World</em></p></markdown-helper>

【问题讨论】:

    标签: c# asp.net-core razor-pages asp.net-core-tag-helpers


    【解决方案1】:

    欢迎来到 StackOverflow!

    我深入研究了 Adam Freeman 的 ASP.NET Core MVC 2 书,因为我发现您的 _ViewImports.cshtml 声明看起来很奇怪,并且还在 docs 中找到了您很可能在那里使用了无效语法的确认。

    根据文档,它应该是这样的(注意.,不是空格):

    @addTagHelper *, MarkdownTagHelper
    

    第二个参数应该指向FQN 或程序集的短名称,然后第一个参数告诉我们要使用给定程序集中的哪些类。您当前的声明是说“从CustomTagHelpers.Helpers 程序集中导入所有类”,它不存在(它是一个命名空间)。至于空格后面的 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 似乎是一个命名空间(docs)呢?这实际上是 dll 文件(程序集)的名称。你可以在这里找到它:%USERPROFILE%\.nuget\packages\microsoft.aspnetcore.mvc.taghelpers\2.0.0\lib\netstandard2.0 或类似的目录。这是它的源代码:linkMicrosoft.AspNetCore.Mvc.TagHelpers 只是类库/程序集的名称。我们也可以通过将项目的结构更改为以下方式来实现相同的技巧:

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

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

    【讨论】:

    • 你是对的,我的 ViewImport 声明是错误的,我尝试了许多不同的方法在 viewImport 中添加这个声明,包括现在你的建议,但它仍然不起作用。如何获取 MarkdownTagHelper 所在的程序集的名称?我之前认为它必须指向命名空间。
    • 哦...是的,我的错。实际上,通过要求您尝试@addTagHelper *, CustomTagHelpers.Helpers.MarkdownTagHelper,我做了与您相同的事情 - 没有放置程序集名称,而是放置类的 FQN (.)。检查我更新的答案。
    猜你喜欢
    • 2015-08-01
    • 2019-06-05
    • 2019-08-01
    • 2018-05-19
    • 1970-01-01
    • 2019-11-07
    • 2012-05-24
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多