Razor HTML条件输出

时间:2011-03-15 15:27:11

标签: razor

我有一个项目列表,我想输出作为主要内容(主要内容未包含在下面)。每个Item都有3个属性:Section Name,Label和Value。每个项目都包含在a中,每次更改部分名称时,我必须打开一个(并关闭前一个,如果有的话)。我正在使用带有此代码的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>");
 }

问题是:每次章节名称更改时,都不会生成字段集标记(打开和/或关闭)。我哪里错了?如果我不使用Html.Raw(或@:作为替代),VS2010解析器会发出错误信号。

2 个答案:

答案 0 :(得分:14)

致电Html.Raw会返回IHtmlString;它不会向页面写任何内容。

相反,你应该写

@:</fieldset>

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


但是,通过调用GroupBy并进行嵌套foreach循环,您的代码可以变得更加清晰。

答案 1 :(得分: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行