2010-11-12 3 views
0

Disons que j'ai le modèle ci-dessousComment ASP.NET MVC: Comment lier une propriété de type Liste <T>?

public class UserInformation 
{ 
    public List<UserInRole> RolesForUser { get; set; }  
    //Other properties omitted... 
} 

public class UserInRole 
{ 
    public string RoleName { get; set; } 
    public bool InRole { get; set; } 
} 

Sur ma page J'ai quelque chose comme

<%using(Html.BeginForm()){%> 
    .../... 
    <%for(int i =0; i<Model.InRoles.Cout; i++%> 
    <p><%: Html.CheckBox(Model.Roles[i].RoleName, Model.Roles[i].InRole)%></p> 
<%}%> 

L'idée est de pouvoir cocher/décocher la case de sorte que lorsque le formulaire est affiché à l'action, l'action agit de manière appropriée en ajoutant/supprimant l'utilisateur de chaque rôle. Le problème est lorsque le formulaire est publié dans la méthode d'action, la propriété Roles (qui est un objet UserInRole de liste) ne reflète pas la modification apportée par l'utilisateur. ModelBinder fonctionne correctement sur toutes les autres propriétés mais 'Roles property'

Je me demande comment je peux faire cela. Je soupçonne que le nom/id donné à la case à cocher n'est pas approprié. Mais, je suis juste pile. Peut-être que je devrais le faire différemment.

Merci de nous aider

+0

double possible de [modèle complexe de liaison à une liste] (http://stackoverflow.com/questions/231878/complex-model-binding-to-a -list) – jfar

Répondre

2

Vous devriez voir le post de Phil Haack sur model binding to a list. Essentiellement ce que vous devez simplement soumettre un tas de champs de formulaire ayant chacun le même nom.

<%@ Page Inherits="ViewPage<UserInformation>" %> 

<% for (int i = 0; i < 3; i++) { %> 

    <%: Html.EditorFor(m => m.RolesForUser[i].RoleName) %> 
    <%: Html.EditorFor(m => m.RolesForUser[i].InRole) %> 

<% } %> 
+0

Eh bien, c'est plutôt plus facile que je ne le pensais. Merci beaucoup. – Richard77

+0

S'il vous plaît, vérifiez pour voir ma question. Maintenant que je vérifie votre réponse, je vois que vous faites hériter la page de IList . Mais le modèle est UserInformation qui contient la liste . parce que, j'ai essayé ce que vous avez suggéré, mais je reçois toujours des valeurs nulles. – Richard77

+0

Essayez d'utiliser m => m.RolesForUser [i] –

1

Je pense que le problème est de savoir comment envoyer vos données de formulaire. Pour que la liaison de modèle fonctionne, elle a besoin du nom de clé avec sa valeur associée. Le code ci-dessous en fonction de votre code devrait se lier correctement:

<%using(Html.BeginForm()){%> 
    .../... 
    <%for(int i =0; i<Model.RolesForUser.Count; i++%> 
    <p> 
    <%: Html.Hidden("UserInformation.RolesForUser[" + i + "].RoleName", Model.RolesForUser[i].RoleName) %> 
    <%: Html.CheckBox("UserInformation.RolesForUser[" + i + "].InRole", Model.RolesForUser[i].InRole) %> 
    <%: Model.RolesForUser[i].RoleName %> 
    </p> 
<%}%> 
+0

intéressant! Seulement une chose. Pourquoi avez-vous utilisé Html.Hidden? – Richard77

+0

J'ai inclus la propriété RoleName juste pour l'exhaustivité mais bien sûr, cela pourrait être omis si vous aviez des inquiétudes concernant la valeur falsifiée. –

+0

Je reçois toujours null pour la liste . – Richard77

Questions connexes