2010-01-30 23 views
5

Ich habe 2 Objekte in meinem ViewmodelASP.NET MVC Viewmodel und Dropdownlist

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

ich dies mit einem Html.DropDownListFor

Ich möchte bearbeiten möchten MVC Auto bekommen, die Daten serialisiert in/aus dem ViewModel so kann ich folgende

public ActionResult Edit(ViewModel1 model) ... 

Was ist der beste Weg, dies zu erreichen?

+0

Sind Sie mit ASP.NET MVC Version 1 oder 2? –

+0

Ich benutze Version 2 – jameszhao00

Antwort

11

Wie womp sagte, nur ein Browser den gewählten Wert einer Dropdown-Liste vorlegen wird. Dies ist leicht an die Standardmodellmappe gebunden, siehe unten.

Wenn Sie die PossibleValues-Liste auf dem Client nicht bearbeiten, müssen Sie sie nicht zurück senden. Wenn Sie die Liste erneut füllen müssen, führen Sie die Server-Seite in Ihrer Post-Aktion aus, indem Sie dieselbe Methode verwenden, mit der Sie das Dictionary ursprünglich gefüllt haben.

Zum Beispiel in Sie Seite:

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

In Ihrem Controller

[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); 
} 

Wo GetDictionary() ist eine Methode, die Ihre bevölkerten Dictionary-Objekt zurückgibt.

See this similar question for more details

0

Ich glaube nicht, dass Sie ein Wörterbuch aus einer Dropdown-Liste in einem Formular erstellen können. Eine Dropdown-Liste wird nur einen Wert zurückgeben, den Sie als Ihre SelectedKey-Eigenschaft festlegen können, aber Sie können das PossibleValues-Wörterbuch nicht daraus rekonstruieren.

Um ein Wörterbuch zu rekonstruieren, müssen Sie ein Formularfeld für jeden Eintrag darin haben. Man könnte so etwas wie dies, erzeugte mit einer foreach-Schleife über den Wörterbuch tun:

<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"> 
. 
. 
. 

Letztendlich würde ich die Notwendigkeit in Frage, das Wörterbuch aus dem Formular wieder zu bevölkern. Wenn sie nur einen Wert auswählen können, warum sollten die PossibleValues ​​nicht nur von außerhalb Ihres ViewModels (wie in Ihrem Repository) gesucht werden? Warum sollten Sie sie mit dem ViewModel speichern?

0

Die Lösung benutzerdefinierte in ASP.NET MVC-Framework ist hier ModelBinding sind einige Beispiele ..

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

www.singingeels.com/ Artikel/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

hoffen, dass Sie sie nützlich finden ...

Dank