我有一个项目列表,我想输出作为主要内容(主要内容未包含在下面).每个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>");
}
Run Code Online (Sandbox Code Playgroud)
问题是:每次章节名称更改时,都不会生成字段集标记(打开和/或关闭).我哪里错了?如果我不使用Html.Raw(或@:作为替代),VS2010解析器会发出错误信号.
SLa*_*aks 14
呼叫Html.Raw返回IHtmlString; 它不会向页面写任何内容.
相反,你应该写
@:</fieldset>
Run Code Online (Sandbox Code Playgroud)
使用@: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>
}
Run Code Online (Sandbox Code Playgroud)
12行代码而不是18行
| 归档时间: |
|
| 查看次数: |
9888 次 |
| 最近记录: |