我在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-->
有人知道如何取消引用该关闭块以使其正确呈现吗?
@:
开始这一行答案 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}>")
}