2010-09-14 21 views
8

J'ai une vue partielle qui rend une liste d'objets dans un format de table et permet l'édition des valeurs ...mvc.net comment utiliser les aides fortement typées itérer liste en

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBox("name",p.name) %> 
    <%: Html.ValidationMessage(p.name) %> 
    </td> 

<% } %> 

Je suis vouloir refactoriser ceci pour profiter des helpers html fortement typés dans mvc2. Je rencontre des difficultés à comprendre comment créer les expressions lambda et espérais de l'aide. ce qui suit ne me semble pas tout à fait correct.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBoxFor(???) %> 
    </td> 

<% } %> 

Répondre

8

tout d'abord vous ne devriez pas être dans une vue itération. Itérer signifie des boucles, des boucles signifient C#/VB.NET, C#/VB.NET dans une vue conduit au code spaghetti.

Je vous recommande d'utiliser Editor Templates. De cette façon, vous n'avez pas besoin d'écrire des boucles dans vos vues. Ajoutez le fichier suivant dans ~/Views/Home/EditorTemplates/PictureModel.ascx:

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<whoozit.Models.PictureModel>" %> 
<td> 
    <%: Html.TextBoxFor(x => x.name) %> 
    <%: Html.ValidationMessageFor(x => x.name) %> 
</td> 

Notez que la partie est maintenant fortement typé à whoozit.Models.PictureModel au lieu de IList<whoozit.Models.PictureModel>. Maintenant, tout ce qui reste est d'inclure cette partie de la vue principale:

<%: Html.EditorFor(x => x.Pictures) %> 

Pictures est une propriété de type IList<whoozit.Models.PictureModel> sur votre modèle de la vue principale. Cela va automatiquement invoquer le partiel pour chaque élément de la collection afin que vous n'ayez pas besoin d'écrire des boucles laides dans vos vues.

Cela fonctionne simplement par convention: le partiel doit être appelé PictureModel.ascx comme nom de type des éléments de la liste et situé dans le dossier ~/Views/Home/EditorTemplates ou ~/Views/Shared/EditorTemplates.

Les modèles d'éditeur/affichage rendront vos vues beaucoup plus élégantes. Remarque: Dans .NET, la convention est un nom de propriété commençant par une lettre majuscule. Je vous recommande donc de renommer la propriété name en Name. Il est simplement plus naturel d'écrire et de lire:

<%: Html.TextBoxFor(x => x.Name) %> 
1
<%= Html.TextBoxFor(p => p.name) %> 
+0

cela donne une erreur de « IList ne contient pas de définition du nom ...'la variable' p 'est de type Liste et non de Picture, donc je ne peux pas accéder au champ name – yamspog

1

Vous dites votre vue partielle d'attendre une liste des articles whoozit.Models.PictureModel. Alors votre foreach cherche whoozit.Models.Picture pas PictureModel. Voici comment je ferais normalement quelque chose comme ça. Assurez-vous que la liste que vous essayez d'énumérer est correcte. Si la classe d'image provient d'une collection à l'intérieur du PictureModel, assurez-vous de faire Model. Quel que soit dans le foreach.

Essayez ceci:

<% foreach(var p in Model) { %> 
<td> 
<%: Html.TextBoxFor(p => p.name) %> 
<%: Html.ValidateFor(p => p.name) %> 
</td> 
<% } %> 
2

Vous pouvez utiliser des méthodes d'aide fortement typées en bouclant le modèle avec une boucle for. Cela rendra également l'attribut html "name" unique afin que le classeur modèle puisse vous aider à mapper les valeurs à votre modèle dans une situation de sauvegarde.

<% for (int i = 0; i < Model.Count; i++) { %> 

    <%: Html.TextBoxFor(m => m[i].Name) %> 
    <%: Html.TextBoxFor(m => m[i].SomethingElse) %> 

<% } %> 

En savoir plus ici .. http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx