Razor HTML条件输出

Razor HTML条件输出,razor,Razor,我有一个要输出为main内容的项目列表(下面不包括main)。每个项目有3个属性:节名称、标签和值。每个项目都包含在a中,每次节名更改时,我都必须打开a(并关闭上一个,如果有)。我将Razor视图用于以下代码: @foreach (LocalStorageItem lsi in Model) { string fld_name = "f_" + lsi.ItemName; if (lsi.SectionName != sn) { if (sn != "") {

我有一个要输出为main内容的项目列表(下面不包括main)。每个项目有3个属性:节名称、标签和值。每个项目都包含在a中,每次节名更改时,我都必须打开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>");
 }
@foreach(模型中的LocalStorageItem lsi){
字符串fld_name=“f_”+lsi.ItemName;
if(lsi.SectionName!=sn){
如果(sn!=“”){
Html.Raw(“”);
}
sn=lsi.SectionName;
@锡
Html.Raw(“”);
}
@lsi.ItemName
.
}
@如果(Model.Count!=0){
Html.Raw(“”);
}

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

调用
Html.Raw
返回
IHtmlString
;它不会在页面上写任何东西

相反,你应该写作

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



但是,通过调用
GroupBy
并创建嵌套的
foreach
循环,您的代码可以变得更干净。

我真的认为使用
@:
来处理此类代码是对转义序列的滥用。相反,应该通过正确重构代码来解决此问题,以便可以轻松编写平衡的标记:

@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>
}
@foreach(Model.GroupBy中的var节(i=>i.SectionName)){
@节.键
@foreach(第节中的LocalStorageItem lsi){
字符串fld_name=“f_”+lsi.ItemName;
@lsi.ItemName
.
}
}

12行代码而不是18行

谢谢您的建议。只有一件事:标签应该放在标签前面,以获得相同的结果。关于
h2
标签,您是对的。这是一个复制粘贴错误。