【问题标题】:Razor HTML Conditional OutputRazor HTML 条件输出
【发布时间】:2011-03-15 15:27:10
【问题描述】:

我有一个项目列表,我想作为 main 的内容输出(main in 不包括在下面)。每个 Item 有 3 个属性:Section Name、Label 和 Value。每个项目都包含在 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>");
 }

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

【问题讨论】:

    标签: razor


    【解决方案1】:

    调用Html.Raw 返回IHtmlString;它不会向页面写入任何内容。

    相反,你应该写

    @:</fieldset>
    

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


    但是,通过调用 GroupBy 并创建一个嵌套的 foreach 循环,您的代码可以变得更加简洁。

    【讨论】:

      【解决方案2】:

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

      @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 标签是对的。那是复制 + 粘贴错误。
      猜你喜欢
      • 2016-05-15
      • 2012-05-07
      • 2017-06-12
      • 1970-01-01
      • 2023-03-17
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多