2009-12-18 5 views
1

Je suis assez nouveau à MVC alors s'il vous plaît n'hésitez pas à suggérer un moyen meilleur/plus propre/plus simple de réaliser ce que je suis en train de faire d'une manière plus conviviale "MVC".Post IDictionary Retour au modèle MVC

ici ...

Pour rendre cela plus facile je vais utiliser un exemple concret en utilisant des films et des genres. Un genre peut être associé à de nombreux films. Les genres peuvent augmenter avec le temps et les films aussi.

Le cas d'utilisation est le suivant. L'utilisateur souhaite filtrer les films en sélectionnant ses genres souhaités. Donc, j'ai une page où en haut il y a une section où l'utilisateur peut choisir n'importe quelle combinaison de genres à filtrer en utilisant des cases à cocher. Ci-dessous, une liste de films dans ces genres.

Dans MVC j'essaye d'implémenter ceci en utilisant un ViewPage (de IDictionary (de Genre, Booléen)) où le booléen est si un genre particulier a été choisi ou non pour le filtrage.

Je vais alors en boucle qui crée des cases à cocher pour eux pour sélectionner:

<% for each genre As KeyValuePair(Of Genre, Boolean) in Model %> 
    <%=Html.Hidden("genre[" & i & "].Key", genre.Key.ID)%> 
    <%=Html.CheckBox("genre[" & i & "].Value", genre.Value)%> 
    <%=Html.TextBox("genre[" & i & "].Key.Name", genre.Key.Name)%> 
<% Next %> 

J'ai dépouillé le formatage de se concentrer sur la viande de la question. Donc, dans le dictionnaire genre.Value retournera si la case à cocher est sélectionnée ou non. Après cela, il y a un morceau de code qui affiche une liste de films en fonction de quels genres ont été sélectionnés.

Mon problème est lorsque je tente de republier (ne pas utiliser Ajax pour l'instant) l'action a une valeur nulle dans le dictionnaire:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function FilterSelected(ByVal selectedGenres As IDictionary(Of MarketCategory, Boolean)) As ActionResult 
    Return View("Index", theView) 
End Function 

Quelqu'un peut-il me dire ce que je suis absent? Aussi, je suis conscient que cela peut être fait en utilisant Ajax et je vais probablement le faire en utilisant Ajax mais j'aimerais quand même savoir pourquoi cela ne fonctionne pas.

Merci ;-)

Répondre

1

Modifier FilterSelected nom de paramètre selectedGenres-genre. DefaultModelBinder correspond à des paramètres par nom:

Function FilterSelected(ByVal genre As IDictionary(Of MarketCategory, Boolean)) 

Vous shoul propably changer aussi

<%=Html.Hidden("genre[" & i & "].Key", genre.Key.ID)%> 

à

<%=Html.Hidden("genre[" & i & "].Key.ID", genre.Key.ID)%> 
+1

Beauté! THX. Un petit ajout à votre commentaire, je devais aussi changer la ligne: <% = Html.Hidden ("genre [" & i & "] .Clé", genre.Key.ID)%> À <% = Html.Hidden ("genre [" & i & "] .Key.ID", genre.Key.ID)%> Et tout a fonctionné. Je ne sais pas ce que je pensais changer les noms ... en théorie, je connaissais le nom correspondant. C'est peut-être parce que je suis en vacances à partir de demain et mon cerveau est parti tôt ;-) – Bitfiddler

+0

@BitFiddler: J'ai eu les mêmes problèmes. Parfois je change le nom de la variable, parce que je ne l'aime pas et oublie qu'elle est utilisée en vue ... – LukLed