认为你可以使这个代码更漂亮?

时间:2010-08-02 00:17:45

标签: c# asp.net-mvc-2

这是一个简单的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>

            <% }

          }
       }%>

你认为你能使这段代码变得更漂亮/更有效吗?

3 个答案:

答案 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)。从它的外观来看,ModelIEnumerable的某种类型,因此您的内部循环将变为

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

您可以通过创建特定于视图的模型并将“区域”属性添加到该模型

来实现类似的功能