自定义标签帮助程序未在剃须刀页面上解释

时间:2020-02-22 10:58:19

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

我尝试向我的项目中添加一个自定义标记帮助程序,以将markdown文本转换为html。 对于转换,我尝试同时使用Makrdig.Markdown和CommonMarkConverter.Convert,但均未成功,但是我认为问题出在没有通过剃须刀页面检测到我的实现。

我的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>

1 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow!

当我发现您的_ViewImports.cshtml声明看起来很奇怪,并且在docs中发现您最有可能在此处使用了无效语法时,我就读了Adam Freeman的ASP.NET Core MVC 2书。 / p>

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

@addTagHelper *, MarkdownTagHelper

作为第二个自变量指向FQN或程序集的简称,然后第一个自变量告诉我们要使用给定程序集中的哪些类。您当前的声明是说“从CustomTagHelpers.Helpers程序集导入所有类”不存在(它是一个名称空间)。至于老实在空格后的3ed部分,我不知道如何解释,很可能会忽略。

您还可以使用以下语法:

@addTagHelper CustomTagHelpers.Helpers, MarkdownTagHelper

但是我想您的意图是第一个从您的程序集中导入所有助手的意图。

请检查是否有帮助?我想可能是这样。

编辑:

我创建了一个简短的示例进行验证,是的-这与无效的@addTagHelper语法有关。

在创建新项目(dotnet new mvc -o Sample)之后,为您的标签助手(程序集)创建了一个lib(dotnet new classlib CustomTagHelpers),并将该lib的引用添加到主项目中,我最终得到了这个:

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

_ViewImports.cshtml文件:

@addTagHelper CustomTagHelpers.Helpers.MarkdownTagHelper, CustomTagHelpers

重建标签助手后可见:

enter image description here

当然,您也可以使用@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

相关问题