9

Ich arbeite an einer ASP.NET MVC-4-Webanwendung. Ich bin die Definition der folgenden in meinem Aktionsmethode zu bauen ein SelectList:Kann der ViewBag-Name mit dem Model-Eigenschaftsnamen in einer DropDownList identisch sein?

ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name"); 

Dann habe ich meine DropDownListFor bin Rendering wie in meinem folgen View:

@Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID, "please select") 

Wie gezeigt Ich Benennung der ViewBag Immobilie gleich dem Model Eigenschaftsnamen sein, der CustomerID ist. Aus meinen eigenen Tests ergab die Definition des gleichen Namens kein Problem oder Konflikt, aber sollte ich dies vermeiden?

+1

Tun Sie dies nicht - es verursacht Probleme (zum Beispiel können Sie keine Client-Seite Validierung bekommen) –

+0

@StephenMuecke Clien Validierung auf was? ViewBag hat keine Validierung –

+0

@teovankot, auf der Modelleigenschaft 'CustomerID' - mit der Verwendung von OP wird es keine' Daten-Val- * '- Attribute erzeugen und der Benutzer wählt die erste" Bitte auswählen "-Option, nein Validierungsfehler wird angezeigt (wenn es sein sollte - vorausgesetzt, "CustomerID" ist typeof "int") –

Antwort

9

Sie sollen nicht den gleichen Namen für das Modell Eigenschaft und die ViewBag Eigenschaft (und im Idealfall sollten Sie nicht ViewBag überhaupt verwenden, sondern ein View-Modell mit einer IEnumerable<SelectListItem> Eigenschaft).

Bei Verwendung von @Html.DropDownListFor(m => m.CustomerId, ....) wird die erste Option "Please Select" immer ausgewählt, auch wenn der Wert der Modelleigenschaft festgelegt wurde und einer der Optionen entspricht. Der Grund dafür ist, dass die Methode zuerst eine neue IEnumerable<SelectListItem> basierend auf der von Ihnen angegebenen generiert, um den Wert der Selected-Eigenschaft festzulegen. Um die Selected Eigenschaft zu setzen, liest es den Wert CustomerID von ViewData, und das erste, das es findet, ist "IEnumerable<SelectListItem>" (nicht der Wert der Modelleigenschaft) und kann diese Zeichenkette mit irgendwelchen Ihren Wahlen nicht zusammenbringen, also ist die erste Wahl ausgewählt (weil etwas sein muss).

Wenn @Html.DropDownList("CustomerId", ....) verwenden, keine data-val-* Attribute generiert und Sie werden jede Client-seitige Validierung

einen Vergleich der möglichen Anwendungsfälle finden Sie nicht bekommen this DotNetFiddle zeigt. Nur durch die Verwendung unterschiedlicher Namen für die Modelleigenschaft und die ViewBag-Eigenschaft wird alles ordnungsgemäß funktionieren.

+0

ok, du hast überall Recht –

+0

Fehler in der Geige, wenn ich auf Submit-Button klicke. Es heißt: "Das ViewData-Element, das den Schlüssel 'CustomerA' hat, ist vom Typ 'System.Int32', muss aber vom Typ 'IEnumerable ' sein." – Saurabh

+0

@Saurabh, Das ist, weil ich die 'SelectLists' in der POST-Methode vor dem Zurückgeben der Ansicht (gemäß der GET-Methode) - aber das ist nicht der Punkt der Geige - es zu zeigen, dass Sie keine korrekte 2-Wege-Bindung und/oder Validierung erhalten können, wenn der gleiche Name für die Eigenschaft Ihre Bindung verwendet wird to und die 'SelectList' (und wenn Sie weitere Details zu diesem Fehler wünschen, beziehen Sie sich auf [diese Frage/Antwort] (https://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key) -xxx-is-of-type-system-int32-aber-muss-sein-o) –

1

Es gibt keinen Schaden, es zu benutzen. Sie erhalten keinen Fehler. Am besten ist es jedoch, Modelleigenschaften zu binden.

+0

@ US3-57384 können Sie mehr adivce? –

+0

Sehen Sie, was ich in meinem Code verwende. die dein Problem lösen und gut funktionieren. (IEnumerable ) ViewBag.RT – CrazyDev