Почему синтаксис Razor внутри разыменования блока кода не выполняется должным образом? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть следующая разметка в представлении Razor:

<@Model.HeadingName>
  @Model.HeadingText
</@Model.HeadingName>

Это прекрасно работает и в итоге выдает что-то вроде этого:

<h2>
  Contact Us
</h2>

Однако, если я хочу проверитьnull, он не может отобразить закрывающий тег:

@if (!string.IsNullOrEmpty(Model.HeadingName))
{
  <@Model.HeadingName>
    @Model.HeadingText
  </@Model.HeadingName>
}

По какой-то причине это приводит к следующему выводу:

<h2>
  Contact Us
<!--@Model.HeadingName-->

Кто-нибудь знает, как разыменовать этот закрывающий блок, чтобы онотрисовывается правильно?

Вещи, которые я безуспешно пытался

  • Использование @: для начала строки
  • Добавление пробела в закрывающий тег

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Я тоже не мог правильно разыскивать его.К сожалению, похоже, что для перехода обратно в HTML Razor ожидает увидеть имя тега HTML в виде обычного текста.Хотя вы можете добавлять атрибуты к тегам таким образом, поэтому ...

... почему бы не создать пользовательский Tag Helper , тогда ваш Razor изменится на что-то вроде этого:

@if (!string.IsNullOrEmpty(Model.HeadingName))
{
    <dynamic type="@Model.HeadingName">
        @Model.HeadingText
    </dynamic>
}

Чтобы определить этот помощник тега, вам просто нужно создать класс, который наследуется от TagHelper (в этом случае мы создаем класс DynamicTagHelper):

using Microsoft.AspNetCore.Razor.TagHelpers;

namespace MyNamespace.TagHelpers
{
    public class DynamicTagHelper : TagHelper
    {
        public string Type { get; set; } //this must match the attribute

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = Type;    // e.g. replaces <dynamic type="h2"> with <h2>
        }
    }
}

ТогдаЧтобы сделать класс DynamicTagHelper доступным для всех ваших представлений Razor, вы должны добавить директиву addTagHelper в файл Views / _ViewImports.cshtml:

@addTagHelper *, MyNamespace

(Обязательно замените MyNamespace на ваш фактическийnamespace)

Может быть излишним за то, что вы пытались сделать, но, по крайней мере, это может вдохновить вас!

0 голосов
/ 23 апреля 2019

Один из способов сделать это - использовать Html.Raw() для вывода текста, хотя он будет выглядеть уродливо в представлении, и intellisense может помешать «отсутствующему» закрывающему тегу:

@if (!string.IsNullOrEmpty(Model.HeadingName))
{
  <@Model.HeadingName>
    @Model.HeadingText
  @Html.Raw($"</{Model.HeadingName}>")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...