MVC XHTML合规性问题

时间:2008-11-04 23:06:07

标签: asp.net-mvc

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

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

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

我刚刚开始使用MVC,我想我仍然在努力确定绘制线的位置,直到我放置逻辑的位置以及每个图层包含的可接受的逻辑量。

3 个答案:

答案 0 :(得分:4)

我可能会实现代码来在helper方法中呈现该class属性。对此视图特定的一个,或者稍微更通用的一个。这样,你的视图中的代码就会减少,并且它可以处理是否在没有任何内容呈现的情况下呈现类属性。

答案 1 :(得分:1)

此代码的另一个用途是将计算工作移动到控制器或代码隐藏。

即。取代

<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可以在代码隐藏中。

答案 2 :(得分:0)

好吧,基于Phil的意见,这就是我所做的。有用。如果有任何有用的反馈,请添加评论。

  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)) %>>