2010-03-12 6 views
2

Simple question sur les meilleures pratiques. Dire que j'ai:Meilleure pratique pour le pied de page résumé (et similaire) dans MVC

public class Product 
{ 
    public string Name { get; set; } 
    public string Price { get; set; } 
    public int CategoryID { get; set; } 
    public bool IsAvailable { get; set; } 
} 

et j'ai vue à l'aide IEnumerable < produit> comme modèle, et j'itérer les produits sur la page et que vous souhaitez afficher le total des prix à la fin de la liste, dois-je utiliser:

<%= Model.Sum(x=> x.Price) %> 

ou devrais-je utiliser une autre méthode? Cela peut s'étendre à inclure des choses plus impliqués comme:

<%= Model.Where(x=> x.CategoryID == 5 && x.IsAvailable).Sum(x=> x.Price) %> 

et même

<% foreach (Product p in Model.Where(x=> x.IsAvailable) {%> 
-- insert html -- 
<% } %> 

<% foreach (Product p in Model.Where(x=> !x.IsAvailable) {%> 
-- insert html -- 
<% } %> 

Je suppose que cela se résume à devrais-je avoir ce genre de code dans mon point de vue, ou devrais-je être passer à ma vue dans ViewData? Ou peut-être d'une autre manière?

Répondre

2

Si la logique que vous utilisez sur la page est liée à l'affichage des données sur la page, je n'ai aucun problème à utiliser une logique qui effectue des calculs. Le calcul des valeurs dans votre contrôleur et sa fourniture en tant que partie du modèle associent l'affichage à l'action effectuée par le contrôleur, c'est-à-dire si vous voulez simplement changer la façon dont les données sont affichées - par exemple, grouper par catégorie -totals - et attendu que toutes les données soient dans le modèle, alors vous devez toucher à la fois le contrôleur et la vue pour effectuer le changement. Si vous placez les calculs relatifs à l'affichage dans la vue, seule la vue doit être modifiée.

L'appel pour savoir si la logique est liée au métier ou à la vue dépend fortement du contexte. Par exemple, vous pouvez avoir une règle métier indiquant que vous n'affichez que les produits disponibles. L'application de cette règle ne doit certainement pas être fonction de la vue. Dans ce cas, vous devez la déplacer dans le contrôleur (ou même dans le modèle). Mais si c'est un calcul simple du contenu d'un panier ou un filtrage de ce que vous affichez en fonction des propriétés du modèle, je serais d'accord avec cela dans la vue.

0

Je repousserais cette logique dans le contrôleur et le «modèle de vue». Je considère que c'est le «modèle de la vue». Un exemple simple serait

return View(new ProductSummaryViewModel 
{ 
    Products = products, 
    TotalPrice = products.Sum(p => p.Price) 
}); 

Vous pouvez évidemment étendre ceci pour tout ce que la vue doit afficher. Vous pouvez même avoir des collections de sous-modèles qui peuvent rendre les choses beaucoup plus faciles.

Espérons que cela aide

Questions connexes