这是一个简单的MVC视图,它显示数据库中的所有区域,然后列出标题下每个区域中的所有Carreras。
<h2>Listado General de Carreras</h2>
<% foreach (var Area in (List<string>)ViewData["Areas"])
{ %>
<p><span class="titulo"><%: Area%></span></p>
<% foreach (var carrera in Model)
{
if (carrera.Area.Nombre == Area)
{ %>
<p><%=Html.ActionLink(carrera.Nombre, "Details", new { id = carrera.ID })%></p>
<% }
}
}%>
你认为你能使这段代码变得更漂亮/更有效吗?
答案 0 :(得分:1)
我认为您不需要传递ViewData中的区域。按区域排序Model
。然后你需要通过Model
进行一次循环,你可以检查carrera.Area.Nombre
是否与你看到的最后一个不同,如果是,则打印出它的标题。
希望这是有道理的,但如果您需要轻松编写代码,请告诉我。
答案 1 :(得分:0)
在不知道究竟是什么Area
的情况下,很难说出来。但如果有可能,我会将区域移动到视图模型中,并使每个Area
对象都包含carreras集合。
另外,为了使动作链接更漂亮,您可以使用T4MVC。
你最终可能得到这样的代码:
<h2>Listado General de Carreras</h2>
<% foreach (var area in Model.Areas) { %>
<p><span class="titulo"><%:area %></span></p>
<% foreach (var carrera in area) { %>
<p><%:Html.ActionLink(carrera.Nombre, MVC.Carrera.Details(carrera.ID)) %></p>
<% } %>
<% } %>
答案 2 :(得分:0)
你可以用Linq摆脱if(crrera.Area.Nombre == Area)
。从它的外观来看,Model
是IEnumerable
的某种类型,因此您的内部循环将变为
<% foreach var carrera in Model.Where(c => c.Area.Nombre == Area))
{ %>
<p><%= Html.ActionLink(carrera.Nombre, "Details", new { id = carrera.ID })%></p>
<% } %>
这对“效率”没有帮助,但它绝对是“更漂亮”的恕我直言
MVC 3的一些功能对于漂亮的前端也有帮助。首先是Razor语法,第二个是新的ViewModel属性是动态类型的,所以你可以摆脱ViewData及其关联的强制转换的讨厌的字典查找,即你的外部循环将成为
<% foreach (var Area in View.Areas)
} %>
您可以通过创建特定于视图的模型并将“区域”属性添加到该模型
来实现类似的功能