C# 自定义标记帮助器isn';不要在页面上解释
我尝试向我的项目中添加一个自定义标记帮助器,将标记文本转换为html。 对于转换,我尝试使用Makrdig.Markdown和CommonMarkConverter.Convert,但没有成功,但我认为问题在于没有通过razor页面检测到我的实现 我的TagHelper:C# 自定义标记帮助器isn';不要在页面上解释,c#,asp.net-core,razor-pages,asp.net-core-tag-helpers,C#,Asp.net Core,Razor Pages,Asp.net Core Tag Helpers,我尝试向我的项目中添加一个自定义标记帮助器,将标记文本转换为html。 对于转换,我尝试使用Makrdig.Markdown和CommonMarkConverter.Convert,但没有成功,但我认为问题在于没有通过razor页面检测到我的实现 我的TagHelper: using Markdig; using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspN
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是位于我的viewmodel中的一个属性,链接到当前视图,它是一个带有[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书籍,发现您的
\u ViewImports.cshtml
声明看起来很奇怪,并且在中发现您很可能使用了无效语法
根据文档,它应该是这样的(注意
,而不是空格):
第二个参数sholud指向程序集的名称或简称,然后第一个参数告诉我们要使用给定程序集中的哪些类。您当前的声明是“从CustomTagHelpers.Helpers
assembly导入所有类”,该声明不存在(它是一个命名空间)。至于空格后面的第三部分,老实说,我不知道该怎么解释,很可能被忽略了
您还可以使用以下语法:
@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)
...
和\u ViewImports.cshtml
文件:
@addTagHelper CustomTagHelpers.Helpers.MarkdownTagHelper, CustomTagHelpers
重建后,标记辅助对象可见:
当然,您也可以使用@addTagHelper*、CustomTagHelpers
导入程序集的所有类
那么默认的@addTagHelper*,Microsoft.AspNetCore.Mvc.TagHelpers
似乎是一个名称空间(),又如何呢?这实际上是dll文件(程序集)的名称。您可以在这里找到它:%USERPROFILE%\.nuget\packages\microsoft.aspnetcore.mvc.taghelpers\2.0.0\lib\netstandard2.0
或类似目录。以下是它的源代码:。Microsoft.AspNetCore.Mvc.TagHelpers
只是类库/程序集的名称。我们也可以通过将项目的structire更改为以下内容来实现同样的目的:
| 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。检查我的最新答案。
| Sample (sln)
|- CustomTagHelpers.Helpers (classlib)
|-- MarkdownTagHelper.cs (Your code with CustomTagHelpers.Helpers namespace)
|- Sample (mvc project)
...