MVC, Razor @foreach
J'ai entendu que le fait d'avoir @foreach à l'intérieur d'un point de vue est un non-non. Sens, la vue ne doit pas avoir aucune logique à cela. Quelle est la meilleure pratique sur la logique de la @foreach doit-il être?
@foreach..
- Où avez-vous lu cela? La logique est ce rasoir est destiné à!
- veuillez lire la suite de ms tutoriel asp.net/web-pages/tutorials/basics/...
Vous devez vous connecter pour publier un commentaire.
Nulle part, simplement se débarrasser de lui. Vous pouvez utiliser l'éditeur ou des modèles d'affichage.
Ainsi, par exemple:
pourrait parfaitement être remplacé par un modèle d'affichage:
et ensuite vous pourrez définir le correspondant du modèle d'affichage (si vous n'aimez pas le par défaut). Si vous définissez un modèle réutilisable
~/Views/Shared/DisplayTemplates/Foo.cshtml
qui seront automatiquement rendus par le cadre de référence pour chaque élément de la Foos collection (IEnumerable<Foo> Foos { get; set; }
):Évidemment exactement les mêmes conventions s'appliquent pour l'éditeur de modèles qui devraient être utilisés dans le cas où vous souhaitez afficher certains champs de saisie vous permettant de modifier le modèle de vue en revanche pour simplement les afficher en readonly.
foreach
? À tout le moins, d'un modèle d'affichage (alors qu'une approche parfaitement acceptable, peu importe) nécessite un nouveau point de vue à être rendu, ce qui n'est pas libre. La majorité du temps, il ne sera pas nuire à votre site de temps de chargement nettement, mais fait assez, il pourrait causer un gain de performance. Unforeach
autour d'un peu de HTML est et sera toujours de façon quasi instantanée. Comme je l'ai dit, ce n'est pas une affaire énorme de toute façon, si, mais si quelque chose il y a un argument pour à l'aide deforeach
.for
boucles. Un grand merci pour le partage de votre compréhension de l'éditeur de modèles de chez nous! P. s. cette solution fonctionne bien avec votre autre solution stackoverflow.com/questions/11234771/...@Html.DisplayFor(x => x.Foos)
mais que faire si mon modèle est la collection? Devrait-il être@Html.DisplayFor(x => x)
ou est-il une meilleure manière de faire cela? Pouvez-vous fournir un exemple de ce cas d'utilisation dans votre réponse s'il vous plaît?Quand les gens disent ne pas mettre de la logique dans les vues, on se réfère généralement à une logique d'entreprise, pas de la logique rendu. À mon humble avis, je pense que l'aide de @foreach dans les vues est parfaitement bien.
Je suis en utilisant
@foreach
lorsque j'envoie une entité qui contient une liste d'entités ( par exemple, pour afficher 2 grilles 1 vue )Par exemple, si je suis de l'envoyer en tant que modèle de l'entité Foo qui contient
Foo1(List<Foo1>)
etFoo2(List<Foo2>)
Je peux faire référence à la première Liste:
une réponse à @DarinDimitrov pour un cas où j'ai utilisé foreach dans un rasoir vue.
Html.DropDownListFor
qui permet de prendre en compte le titre? Il est trivial et ne transformez pas vos points de vue dans les spaghetti code: stackoverflow.com/a/7938038/29407optgroup
éléments dans la liste de sélection, car il n'y a pas de support pour que, dans le HtmlHelpers. Si vous avez juste besoin d'ajouter un point supplémentaire à la liste de sélection, il y a de meilleures façons de réaliser cela, et puis encore utiliser le helper.La réponse ne fonctionnera pas lors de l'utilisation de la surcharge d'indiquer le modèle
@Html.DisplayFor(x => x.Foos, "YourTemplateName)
.Semble être conçu de cette façon, voir ce cas. Aussi l'exception du cadre donne (sur le type n'a été comme prévu) est tout à fait trompeur et trompé moi du premier coup (merci @CodeCaster)
Dans ce cas vous avez à utilisation
@foreach
IEnumerable<T>
et d'appeler le modèle pour le typeT
pour chaque élément.