Razor HTML条件输出

8

我有一份物品清单,想要将其作为主要内容输出(主要内容未在以下内容中包含)。每个物品都有三个属性:部分名称、标签和值。每个物品都被包含在一个 <div> 标签中,每当部分名称改变时,我就必须打开一个 <div> 标签(如果有的话关闭上一个)。我正在使用 Razor 视图来执行此代码:

@foreach (LocalStorageItem lsi in Model) { 
    string fld_name = "f_" + lsi.ItemName;
    if (lsi.SectionName != sn) {
        if (sn != "") { 
            Html.Raw("</fieldset>"); 
        }
        sn = lsi.SectionName;
        <h2>@sn</h2>
        Html.Raw("<fieldset>");              
    }
        <div class="row">
            <div class="ls_label">@lsi.ItemName</div>
            <div class="ls_content" name="@fld_name" id="@fld_name">.</div>
        </div>        
 }
 @if (Model.Count != 0) {
    Html.Raw("</fieldset>");
 }

问题是:每当“部分名称”更改时,没有生成任何fieldset标签(打开和/或关闭)。我错在哪里了?如果我不使用Html.Raw(或@:作为替代方法),则VS2010解析器会发出错误信号。
2个回答

14

Html.Raw 的调用会返回一个 IHtmlString,它不会将任何内容写入页面。

相反,您应该编写:

@:</fieldset>

使用@:可以强制Razor将其视为纯文本,因此它不需要格式良好。


但是,通过调用GroupBy并进行嵌套的foreach循环,可以使您的代码更加简洁。


8

我认为使用@:来解决这个问题是对该转义序列的滥用。相反,应该通过正确重构代码,使得可以轻松编写平衡的标签来解决这个问题:

@foreach(var section in Model.GroupBy(i => i.SectionName)) {
    <h2>@section.Key</h2>
    <fieldset>
    @foreach(LocalStorageItem lsi in section) {
        string fld_name = "f_" + lsi.ItemName;
        <div class="row">
            <div class="ls_label">@lsi.ItemName</div>
            <div class="ls_content" name="@fld_name" id="@fld_name">.</div>
        </div>
    }
    </fieldset>
}

只需12行代码而不是18行


谢谢您的建议。只有一件事:为了获得相同的结果,<h2>标签应该放在<fieldset>标签之前。 - gattox
你说的 h2 标签是对的。那是一个复制+粘贴错误。 - marcind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接