Пользовательский тег помощник не интерпретируется на странице бритвы - PullRequest
3 голосов
/ 22 февраля 2020

Я пытаюсь добавить в проект собственный помощник по тегам, который преобразует текст уценки в 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 - это атрибут, расположенный в моей модели представления, связанный с текущим представлением, это публичный вид. c строка с [BindProperty]

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

Наконец, если я проверяю код html в своем браузере, кажется, что он интерпретируется буквально, поэтому он такой же, как в коде:

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

Хотелось бы получить что-то подобное

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

1 Ответ

1 голос
/ 22 февраля 2020

Добро пожаловать в StackOverflow!

Я копаюсь в книге ASP. NET Core MVC 2 Адама Фримена, так как я нашел Вашу декларацию _ViewImports.cshtml странно выглядящей, а также нашел подтверждение в docs , что вы, скорее всего, там используете неправильный синтаксис.

На основании документации это должно выглядеть примерно так (обратите внимание на ., а не на пробел):

@addTagHelper *, MarkdownTagHelper

в качестве второго аргумента следует указать либо FQN , либо короткое имя сборки, а затем первый аргумент сообщает нам, какие классы из данной сборки мы хотим использовать. Ваша текущая декларация гласит «импортировать все классы из сборки CustomTagHelpers.Helpers», которая не существует (это пространство имен). Что касается 3-й части после пробела, честно говоря, я не знаю, как это будет интерпретироваться, скорее всего, игнорируется.

Вы также можете использовать этот синтаксис:

@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

После перестройки тега помощник будет виден:

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 или аналогичный каталог. Вот исходный код для этого: ссылка . Microsoft.AspNetCore.Mvc.TagHelpers - это просто имя библиотеки классов / сборки. Мы также можем сделать то же самое, изменив структуру нашего проекта следующим образом:

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

и затем мы можем использовать @addTagHelper *, CustomTagHelpers.Helpers.

...