【问题标题】:Getting HTML headings to be dynamically output by Razor让 Razor 动态输出 HTML 标题
【发布时间】:2016-12-30 12:59:24
【问题描述】:

我正在 Razor 中创建一个页面,并尝试根据节点的深度动态输出标题。

所以顶级节点是h1,二级h2等......

我正在苦苦挣扎的一点是动态输出标题。一半似乎在工作,但结束标签不会输出。

这是剃须刀:

<h@{@parts} id="#@item.Id">@sectionString@level @item.Name </h@{@parts} >

输出以下 HTML:

<h4 id="#1073">4.1.1 Get a baseline </h@{@parts} >

如果我删除正斜杠,它会起作用,但我最终会得到 &lt;h3&gt;&lt;h3&gt; 而不是 &lt;h3&gt;&lt;/h3&gt;

我也试过了:

<h@{@parts} id="#@item.Id">@sectionString@level @item.Name </h@parts >

<h@{@parts} id="#@item.Id">@sectionString@level @item.Name </h@{parts} >

如果我不能让它工作,我想我将不得不诉诸一个我宁愿避免的很长的 if 语句。我认为斜线需要以某种方式转义?谢谢。

【问题讨论】:

  • 变量@parts 包含什么?
  • 这是一个来自var parts = sectionString.Split('.').Count()+1;的号码,我刚刚算出来并在下面发布了答案。

标签: c# razor umbraco


【解决方案1】:

最好做个帮手:

@Heading(1, (sectionString + level + item.Name), item.Id)
@Heading(2, "Sub heading")
@Heading(3, "Lesser heading", "anyId")

@helper Heading(int headingLevel, string title, string id = null)
{
    @if (id != null)
    {
        @Html.Raw(string.Format(@"<h{0} id=""{1}""",  headingLevel, Html.Encode(id)))
    }
    else
    {
        @Html.Raw(string.Format("<h{0}>",  headingLevel))
    }
    @title
    @Html.Raw(string.Format("</h{0}>", headingLevel))
}

【讨论】:

    【解决方案2】:

    解决了!

    <h@{@parts} id="#@item.Id">@sectionString@level @item.Name @Html.Raw("</h")@parts@Html.Raw(">")
    

    我只需要转义代码,它看起来不整洁,但它可以工作。

    编辑:下面的 cmets 显示了一种更好的方法。谢谢你!

    【讨论】:

    • 也许像 @Html.Raw(String.Format("&lt;h{0} id='#{1}'&gt;{2}{3} {4}&lt;/h{5}&gt;", parts, item.Id, sectionString, level, item.Name, parts)); 这样的东西看起来会更干净一些?
    • 补充 @Max 的评论 - 如果您使用 C#6,您可以通过字符串插值使其更加整洁:Html.Raw($"&lt;h{parts} id='#{item.Id}'&gt;{sectionString}{level} {item.Name}&lt;/h{parts}&gt;");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2017-06-12
    • 2022-01-01
    • 2012-12-04
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多