代码之家  ›  专栏  ›  技术社区  ›  Eric Schoonover thSoft

MVC XHTML遵从性问题

  •  1
  • Eric Schoonover thSoft  · 技术社区  · 16 年前

    我有一个模型由我的数据层填充,然后我有一个局部视图,它正在呈现该模型的一个实例。

    <li class="<%= td.Active ? "youarehere" : string.Empty %> <%= i == ViewData.Model.Count() - 1 ? "last" : string.Empty %>">
    

    问题是 class="" 是无效的XHTML,我将需要更复杂的逻辑来输出class属性。使用ASP.NET MVC执行此操作的正确方法是什么?逻辑应该存在于视图中还是模型中?

    我刚开始使用MVC,我想我仍在努力在哪里精确地画线,直到我把逻辑放在哪里,以及每个层包含多少可接受的逻辑量。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Haacked    16 年前

    我可能会实现代码以在助手方法中呈现该类属性。一个特定于此视图,或者一个稍微更通用的视图。这样,视图中的代码就更少了,它可以处理在没有要呈现的情况下是否甚至呈现类属性。

        2
  •  1
  •   oglester    16 年前

    此代码的另一个功能是将计算工作移到控制器或后面的代码中。

    即替换

    <li <%= Html.GenerateAttribute("class", 
       () => string.Format("{0} {1}", td.Active 
         ? "youarehere" : string.Empty, 
       i == ViewData.Model.Count() - 1 
         ? "last" : string.Empty)) %>>
    

    有点像

    <%= Html.ListItem( ViewData.Model.Value, 
           GetItemCssClass(i, ViewData.Model.Count()) ) %>
    

    getitemcssClass可能在代码后面。

        3
  •  0
  •   Eric Schoonover thSoft    16 年前

    好吧,根据菲尔的意见,这就是我所做的。它起作用了。如果有任何人有任何有用的反馈,请添加评论。

    1. 我创建了一个名为GenerateAttribute的HTMLHelper扩展方法。

      public static string GenerateAttribute(this HtmlHelper hh,
                                             string name,
                                             Func<string> valueFunc)
      { 
          string value = valueFunc().Trim();
          if (!string.IsNullOrEmpty(value))
              return string.Format("{0}=\"{1}\"", name, value);
          return string.Empty;
      }
      
    2. 在我的视图中,我调用html.generateattribute,并将其传递给一个lambda表达式,该表达式生成值。如果该值不是string.empty,那么generateAttribute方法将返回完整属性(name=“val”)。

      <li <%= Html.GenerateAttribute("class", () => string.Format("{0} {1}", td.Active ? "youarehere" : string.Empty, i == ViewData.Model.Count() - 1 ? "last" : string.Empty)) %>>