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

我尝试将自定义标签帮助程序添加到我的项目中,以将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>

参考方案

欢迎来到StackOverflow!

我发现亚当·弗里曼(Adam Freeman)的ASP.NET Core MVC 2书籍时,发现您的_ViewImports.cshtml声明看起来很奇怪,并且在docs中发现您最有可能使用无效语法的确认。

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

@addTagHelper *, MarkdownTagHelper

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

您还可以使用以下语法:

@addTagHelper CustomTagHelpers.Helpers, MarkdownTagHelper

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

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

编辑:

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

创建新项目(dotnet new mvc -o Sample)之后,为您的标签助手(程序集)(dotnet new classlib CustomTagHelpers)创建一个lib,并将对该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

重建标签帮助器后可见:

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

当然,您也可以使用@addTagHelper *, CustomTagHelpers导入程序集的所有类。

那么默认的@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers似乎是名称空间(docs)呢?这实际上是dll文件(程序集)的名称。您可以在以下位置找到它:%USERPROFILE%\.nuget\packages\microsoft.aspnetcore.mvc.taghelpers\2.0.0\lib\netstandard2.0或类似目录。这是它的源代码: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

ASP.NET Core Singleton实例与瞬态实例的性能 - c#

在ASP.NET Core依赖注入中,我只是想知道注册Singleton实例是否会比注册Transient实例更好地提高性能?在我看来,对于Singleton实例,创建新对象和相关对象只需花费一次时间。对于Transient实例,此成本将针对每个服务请求重复。因此Singleton似乎更好。但是,在Singleton上使用Transient时,我们可以获得多…

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET Core MVC视图组件搜索路径 - c#

在此处的文档中:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.2 运行时在以下路径中搜索视图:/Views/{Controller Name}/Components/{View Component Name}/{View Nam…

ASP.NET MVC Core 3.0 API将枚举序列化为字符串 - c#

如何在ASP.NET MVC Core 3.0中将Enum字段序列化为String而不是Int?我不能用旧的方式做。services.AddMvc().AddJsonOptions(opts => { opts.JsonSerializerOptions.Converters.Add(new StringEnumConverter()); }) 我收到…