我有一个由我的数据层填充的模型,然后我有一个部分视图,它正在渲染该模型的实例。
<li class="<%= td.Active ? "youarehere" : string.Empty %> <%= i == ViewData.Model.Count() - 1 ? "last" : string.Empty %>">
问题是class=""
是无效的XHTML,我需要更复杂的逻辑来输出class属性。使用ASP.NET MVC进行此操作的正确方法是什么。逻辑应该存在于视图还是模型中?
我刚刚开始使用MVC,我想我仍然在努力确定绘制线的位置,直到我放置逻辑的位置以及每个图层包含的可接受的逻辑量。
答案 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的意见,这就是我所做的。有用。如果有任何有用的反馈,请添加评论。
我创建了一个名为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;
}
从我的视图中我调用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)) %>>