2011-05-28 1 views
0

J'ai une vue typée en tant qu'élément (une classe que j'ai créée) avec un formulaire à l'intérieur pour ajouter des éléments à ma base de données. Cette classe d'objet a une propriété appelée Catégories qui est une liste (catégorie a 2 propriétés ID et Nom)asp.net mvc 3 Modèle avec propriété complexe et cases à cocher

Im en utilisant un editorfor à mon avis:

<div> 
    @(Html.EditorFor(e => e.Categories, "Categories"))  
</div> 

J'ai créé un EditorTemplatefor appelé « Categories.cshtml » rendre toutes les catégories disponibles:

@{ 
    Layout = null; 
} 
@model List<Category> 

@{ 
    foreach (Category category in ((BaseController)this.ViewContext.Controller).BaseStateManager.AvailableCategories) 
    { 
     @Html.Label("test", category.Name) 
     <input type="checkbox" name="Categories" value="@(category.ID)" /> 
    }  
} 

les cases sont bien rendus (un pour chaque catégorie disponible dans le cache), mais après avoir cliqué sur dans certains cas, et après la forme, im recevant mon exemple de l'article, mais avec la propriété Catégories vide.

Que dois-je faire pour recevoir mes catégories de liste complètement instanciées après avoir soumis le formulaire?

Répondre

1

Ne pas le boucler. Laissez le framework générer le code pour vous (alors, il saura le reconstruire et le lier à votre contrôleur).

Passez simplement la liste au modèle de l'éditeur et mvc fera le reste. Vérifiez mon blog post sur quelque chose de similaire.

+0

Merci Shawn, vraiment utile. J'ai un dernier doute, je dois imprimer dans mon cas toutes les catégories mises en cache. Pour modifier un élément, j'ai besoin de montrer toutes les catégories du cache mais j'ai coché celles que mon objet a. Comment résolvez-vous cela? Merci. – Jose3d

+0

Créer un modèle de vue qui va être exactement ce qui se passe sur la vue. La propriété booléenne de la case à cocher doit donc déjà être traitée avant de transmettre le modèle à l'éditeur. –

0

Essayez d'utiliser une boucle basée sur l'index. Cela garantit MVC rendra les attributs de l'élément de telle sorte que le classeur de modèle par défaut instancie le modèle à posteriori. Aussi, utilisez l'aide Html pour la case à cocher aussi:

var categories = ((BaseController)this.ViewContext.Controller).BaseStateManager.AvailableCategories; 

for (var index = 0; index < categories.Count; index ++) 
{ 
    @Html.Label("test", categories[index].Name) 
    @Html.Checkbox("ID", categories[index].ID) 
} 
+0

Salut Attadeini, merci pour la réponse. Les éléments sont rendus, mais en postback je reçois mon model.Categories = null. Est-ce que tu sais pourquoi? Merci.Jose – Jose3d

Questions connexes