代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

你觉得你能让这段代码更漂亮吗?

  •  1
  • Sergio Tapia  · 技术社区  · 14 年前

    下面是一个简单的MVC视图,它显示DB中的所有区域,然后在标题下列出每个区域中的所有carrera。

    <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 回复  |  直到 14 年前
        1
  •  0
  •   Simon Fox    14 年前

    你可以把这个 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>
    <% } %>
    

    mvc3的一些特性也会在美观方面有所帮助。首先是Razor语法,其次是新的ViewModel属性是dynamic类型,这样您就可以摆脱对ViewData及其相关转换的讨厌的字典查找,即您的外循环将变成

    <% foreach (var Area in View.Areas)
    } %>
    

    通过创建视图特定的模型并将Areas属性附加到该模型上,可以实现类似的效果

        2
  •  1
  •   Rebecca Chernoff    14 年前

    我认为您不需要传递ViewData中的区域。整理你的 Model 模型 你可以检查一下 carrera.Area.Nombre 与您看到的上一个不同,如果是,请打印它的标题。

    希望这是有意义的,但是如果你需要代码的推动,请告诉我。

        3
  •  0
  •   Necros    14 年前

    不知道到底是什么很难说 Area 面积 对象具有carrera的集合。

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