2010-01-30 5 views
5

j'ai 2 propriétés dans mon ViewModelASP.NET MVC ViewModel et DropDownList

class ViewModel1 
{ 
    Dictonary<int, string> PossibleValues {get;set;}//key/value 
    int SelectedKey {get;set} 
} 

Je veux modifier cela en utilisant un Html.DropDownListFor

Je veux MVC auto sérialiser les données dans/de la ViewModel afin que je puisse le suivant

public ActionResult Edit(ViewModel1 model) ... 

Quelle est la meilleure façon d'accomplir cela?

+0

Utilisez-vous la version ASP.NET MVC 1 ou 2? –

+0

J'utilise la version 2 – jameszhao00

Répondre

11

Comme womp dit, un navigateur ne soumettra la valeur sélectionnée d'une liste déroulante. Ceci est facilement lié au classeur par défaut, voir ci-dessous.

Si vous ne modifiez pas la liste PossibleValues ​​sur le client, il n'est pas nécessaire de les renvoyer. Si vous avez besoin de repeupler la liste, faites-le côté serveur dans votre action de publication en utilisant la même méthode que celle utilisée pour le dictionnaire.

Par exemple, en vous page:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<ViewModel1>" %> 
<!-- some html here --> 
<%= Html.DropDownListFor(x => x.SelectedKey, new SelectList(Model.PossibleValues, "key", "value"))%> 

Dans votre contrôleur

[AcceptVerbs(HttpVerbs.Get)] 
public ViewResult Edit() { 
var model = new ViewModel1 { 
    PossibleValues = GetDictionary() //populate your Dictionary here 
}; 
return View(model); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ViewResult Edit(ViewModel1 model) { //default model binding 
    model.PossibleValues = GetDictionary(); //repopulate your Dictionary here 
    return View(model); 
} 

Où GetDictionary() est une méthode qui retourne votre objet Dictionnaire peuplé.

See this similar question for more details

0

Je ne pense pas que vous serez capable de construire un dictionnaire à partir d'une liste déroulante sur un formulaire. Une liste déroulante ne renverra qu'une seule valeur, que vous pouvez définir comme votre propriété SelectedKey, mais vous ne pourrez pas y reconstruire le dictionnaire PossibleValues. Pour reconstruire un dictionnaire, vous aurez besoin d'un champ de formulaire pour chaque entrée de ce dictionnaire. Vous pourriez faire quelque chose comme ça, généré par une boucle foreach sur votre dictionnaire:

<input type="hidden" name="PossibleValues[0].Key" value="key0"> 
<input type="hidden" name="PossibleValues[0].Value" value="value0"> 
<input type="hidden" name="PossibleValues[1].Key" value="key1"> 
<input type="hidden" name="PossibleValues[1].Value" value="value1"> 
. 
. 
. 

En fin de compte je mets en doute la nécessité de repeupler le dictionnaire de la forme. S'ils ne peuvent choisir qu'une seule valeur, pourquoi les valeurs possibles ne seraient-elles pas une recherche de quelque part en dehors de votre ViewModel (comme dans votre référentiel?) Pourquoi le stocker avec ViewModel?

0

La solution est personnalisée dans ModelBinding framework ASP.NET MVC voici quelques exemples ..

stevesmithblog.com/blog/binding-in-asp-net-mvc

www.singingeels.com/ articles/Model_Binders_in_ASPNET_MVC.aspx

odetocode.com/Blogs/scott/archive/2009/04/27/12788.aspx

odetocode.com/Blogs/scott/archive/2009/05/05/12801. aspx

espère que vous les trouverez utiles ...

Merci