2010-08-02 5 views
1

Voici une simple vue MVC qui affiche toutes les zones dans une base de données et liste toutes les Carreras dans chaque zone sous l'en-tête.Vous pensez pouvoir rendre ce code plus joli?

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

      <% } 

      } 
     }%> 

Pensez-vous que vous pouvez rendre ce code un peu plus joli/efficace?

Répondre

0

Vous pouvez vous débarrasser de l'if(crrera.Area.Nombre == Area) avec LINQ. De l'apparence de celui-ci votre Model est un certain type de IEnumerable de sorte que votre boucle intérieure deviendrait

<% foreach var carrera in Model.Where(c => c.Area.Nombre == Area)) 
{ %> 
    <p><%= Html.ActionLink(carrera.Nombre, "Details", new { id = carrera.ID })%></p> 
<% } %> 

Cela aiderait pas vraiment avec « efficacité », mais il est certainement « plus joli » à mon humble avis

Couple de MVC 3 caractéristiques aideraient également sur le front de joliesse. D'abord la syntaxe Razor, et deuxième la nouvelle propriété ViewModel est de type dynamique et vous souhaitez vous débarrasser de la recherche de dictionnaire méchant sur ViewData et son casting associé-à-dire votre boucle extérieure deviendrait

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

Vous pouvez obtenir quelque chose de similaire en créant une vue modèle spécifique et le clouage de propriété sur les zones à ce modèle

+0

Merci, j'ai vu MVC3 hier soir et j'ai hâte d'y être! Cela semble plutôt agréable à utiliser. : P –

+0

Pourquoi ne pas aller pour joli et efficace au lieu de simplement jolie? Vous ** pouvez ** avoir les deux. –

+0

@rchern ne sait pas d'où vous êtes entré en vigueur ... cela fait exactement ce que le PO a demandé pour qu'il soit efficace. En ce qui concerne l'efficacité, je dirais que tout gain obtenu en supprimant le bloc 'if' de la boucle interne est négligeable et c'est pourquoi je le dis" ne serait pas vraiment utile "... Je vais laisser à ceux beaucoup plus intelligents que Pour expliquer un concept, vous devriez vous familiariser avec http://c2.com/cgi/wiki?PrematureOptimization –

1

Je ne pense pas que vous devez passer les zones dans le ViewData. Triez le Model par région. Ensuite, vous avez juste besoin d'une seule boucle à travers Model et vous pouvez vérifier si carrera.Area.Nombre est différent du dernier que vous avez vu, et si c'est le cas, imprimez l'en-tête pour cela.

Espérons que logique, mais laissez-moi savoir si vous avez besoin d'un petit coup de pouce avec le code.

0

un peu difficile à dire sans savoir ce qui est exactement Area. Mais si c'est possible, je déplacerais des zones dans le modèle de vue, et rendrais chaque objet Area collection de carreras.

également de faire le lien d'action plus jolie que vous pouvez utiliser T4MVC.

Vous pourriez finir avec le code comme ceci:

<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

Je suis d'accord avec la suggestion T4MVC. Je l'ai utilisé et il rend le code plus lisible et se débarrasse de ces terribles chaînes magiques dans les vues. –

Questions connexes