为什么代码块内的Razor语法无法正确取消引用?

时间:2019-04-23 16:25:54

标签: asp.net razor

我在Razor视图中具有以下标记:

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

这很好用,最终呈现出如下内容:

<h2>
  Contact Us
</h2>

但是,如果我要检查是否为空,则无法呈现结束标记:

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

由于某些原因,将导致以下输出:

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

有人知道如何取消引用该关闭块以使其正确呈现吗?

我尝试失败的事情

  • 使用@:开始这一行
  • 在结束标记中添加空格

2 个答案:

答案 0 :(得分:1)

我也无法正确取消引用。不幸的是,似乎为了过渡回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替换为您的实际名称空间)

对于您尝试做的事情可能会过大,但这至少可以激发您的灵感!

答案 1 :(得分:0)

一种实现方法是使用Html.Raw()输出文本,尽管它在视图中看起来很丑陋,并且intellisense可能会对“缺少”的结束标记不利:

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