2009-05-21 19 views
0

Ich habe eine DropDownList mit einer SelectList gefüllt von einem anonymen Typ gefüllt, die zwei Eigenschaften "CountryId" (int) und "Description" (string) hat. Ich möchte, dass das ausgewählte Land in der Liste das Standardland ist.DropDownList SelectedValue nicht ordnungsgemäß binden

wo "Länder" ist ein IQueryable von anonymen Typen aus einer Linq-Abfrage. Die Länder ist eine öffentliche Eigenschaft auf einen Blick Modell:

public class CountryBaseViewModel 
{ 
    public SelectList Countries { get; set; } 
    public Contact Contact { get;set; } 
    .... 
} 

Das HTML sieht wie folgt aus:

<p> 
<label for="CountryId">Home Country:</label> 
<%= Html.DropDownList("CountryId", Model.Countries)%> 
</p> 

Das ist in Ordnung und wenn ich die Seite zu laden, wird das richtige Land ausgewählt.

Aber wenn ich die Änderung an der Edit-Methode auf dem Controller übermitteln, scheint die Bindung fehlzuschlagen.

Zum Beispiel, wenn ich den folgenden HTML verwenden

<p> 
<label for="Contact.Job">Job/Post:</label> 
<%= Html.TextBox("Contact.Job", Model.Contact.Job) %> 
</p> 

Und ich rufe die Methode

public ActionResult Create(Contact contact) 

auf dem Controller, dann wird der Wert contact.Job korrekt aus dem Text gefüllt ist aber die CountryId ist nicht.

Ich nehme an MVC verwendet den "Contact.Job" (TextBox 1st) Parameter, um dies zu setzen. Aber der erste Parameter der DropDownList ist "CountryId" und nicht "Contact.CountryId", denn wenn dies der Fall ist, wird der ausgewählte Wert nicht in der Liste angezeigt, wenn ich ihn lade.

Es sieht so aus, als ob der erste Parameter von TextBox für Datenbindung ist und der erste Parameter von DropDownList ist, das ausgewählte Element zu finden.

Wie verwende ich diese Art der Datenbindung, um den gewünschten Wert in der DropDownList zu erhalten und dann an Model.Contact.Country zu binden?

Antwort

3

Sie müssen den ausgewählten Wert manuell aus der Dropdown-Liste binden, indem Sie nach der Entität suchen, an die Sie tatsächlich binden müssen, in Ihrer Controller-Aktion, die auf dem POST aufgerufen wird. Sie können entweder einen stark typisierten Wert in Ihrem ViewModel verwenden, wie Sie es in Ihrem zweiten Post vorgeschlagen haben, oder Sie können den Wert der Dropdown-Liste im ViewData-Paket nachschlagen.

So haben Sie fast alles an Ort und Stelle, aber in Ihrer Controller-Aktion, die den POST behandelt, möchten Sie den Wert der Dropdown-Liste abrufen, die Entität laden, die diesem Wert zugeordnet ist, und dann diese Entität anhängen das Objekt, das Sie aktualisieren möchten. Abhängig von Ihrer Architektur ist dies oft nur ein einfacher Aufruf an ein Repository oder einen Datenzugriffsdienst. Sie würden diese manuelle Bindung durchführen, bevor Sie die Änderungen für das Hauptobjekt, mit dem Sie arbeiten, beibehalten.

1

Es ist wahrscheinlich nicht die eleganteste Lösung zur Verfügung, aber die Art und Weise, dass ich dies tat, war, um manuell den gewählten Wert auf dem Objekt in der Action gesetzt:

contact.CountryID = Request.Form("CountryId") 

Ich mag glauben, dass es wahrscheinlich eine bessere Lösung aber ich weiß nicht was es ist.

0

Auch anderswo gefunden, obwohl ich nicht wirklich denke, dass es ideal ist!

Wenn ich dem View-Modell eine CountryId hinzufüge und diese zum Festlegen des ausgewählten Elements verwende, wird diese beim Ändern ausgefüllt.

Dann mache ich

contact.CountryId = Model.CountryId 

Immer noch nicht sehr schön fühlt.

Verwandte Themen