2010-08-02 79 views
1

下面是一個簡單的MVC視圖,它顯示數據庫中的所有區域,然後列出標題下每個區域中的所有卡雷拉。認爲你可以讓這個代碼更漂亮嗎?

<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

你可以擺脫if(crrera.Area.Nombre == Area)使用LINQ的。從它的外觀你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個功能也將有助於美化前沿。首先,剃刀語法,和第二新的視圖模型屬性的類型的動態的,所以你會擺脫對的ViewData及其關聯即你的外環鑄討厭的字典查找會成爲

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

你可以實現類似的東西通過創建一個視圖特定的模型和釘在該模型上的Areas屬性

+0

謝謝,昨晚我看到了MVC3,我不能等它!它似乎很好用。 :P – 2010-08-02 01:09:10

+0

爲什麼不去漂亮而有效而不是漂亮?你**可以**都有。 – 2010-08-02 01:50:45

+0

@rchern不知道你從哪裏得到有效......這正是OP所要求的,所以它是有效的。至於效率,我認爲通過刪除內部循環的if區塊可以獲得的任何收益都可以忽略不計,這就是爲什麼我說它「不會真正幫助」的原因......我會把它放在那些比智能我解釋一個概念,你應該熟悉自己http://c2.com/cgi/wiki?PrematureOptimization – 2010-08-02 02:36:20

1

我不認爲你需要通過ViewData中的區域。按區域排序您的Model。然後你只需要通過Model單個循環,你可以檢查carrera.Area.Nombre是否與你看到的最後一個不一樣,如果是這樣,打印出它的標題。

希望這是有道理的,但讓我知道如果你需要與代碼微調。

0

有點難以分辨不知道到底是什麼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> 
    <% } %> 

<% } %> 
+0

我同意T4MVC的建議。我一直在使用它,它使得代碼更具可讀性並且消除了視圖中那些可怕的魔術字符串。 – 2010-08-02 01:09:09