Noch einmal bin ich konfrontiert mit einer "Das sollte nicht das sein? *! # Hard" -Situation.An eine SelectList in MVC binden
Problem: Ich möchte ein Formular in MVC für die Erstellung eines Objekts verwenden. Eines der Elemente des Objekts ist eine Reihe von begrenzten Möglichkeiten - ein perfekter Kandidat für eine Dropdown-Liste.
Aber wenn ich eine SelectList in meinem Modell und eine Dropdown-Liste in meiner Ansicht verwenden und dann versuchen, das Modell zurück zu meiner Create-Methode zu veröffentlichen, erhalte ich den Fehler "Fehlende Methodenausnahme: Kein parameterloser Konstruktor dafür Objekt". Beim Durchsuchen des MVC-Quellcodes scheint es so zu sein, dass die Sammelmappe erst dann in der Lage sein muss, um sie an ein Modell zu binden, und dass sie keine SelectList erstellen kann, weil es keinen Standardkonstruktor dafür gibt.
Hier ist der vereinfachte Code: Für das Modell:
public class DemoCreateViewModel
{
public SelectList Choice { get; set; }
}
Für die Steuerung:
//
// GET: /Demo/Create
public ActionResult Create()
{
DemoCreateViewModel data = new DemoCreateViewModel();
data.Choice = new SelectList(new string[] { "Choice1", "Choice2", "Choice3" });
ViewData.Model = data;
return View();
}
//
// POST: /Demo/Create
[HttpPost]
public ActionResult Create(DemoCreateViewModel form)
{
try
{
// TODO: Add insert logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Und für die Ansicht:
<fieldset>
<legend>Fields</legend>
<%= Html.LabelFor(model => model.Choice) %>
<%= Html.DropDownListFor(model => model.Choice, Model.Choice) %>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
Nun, ich weiß, ich kann MACHEN Sie dies, indem Sie 10 Yards und Punting zurücklassen: Umgehen Sie die Modellbindung und legen Sie sie auf dem FormCo ab Wählen und validieren und binden Sie alle Felder selbst, aber es muss einen einfacheren Weg geben. Ich meine, das ist ungefähr so einfach wie es nur geht. Gibt es eine Möglichkeit, dies innerhalb der MVC ModelBinding-Architektur zu ermöglichen? Wenn ja, was ist das? Und wenn nicht, wieso?
Edit: Nun, ich habe Ei auf meinem Gesicht, aber vielleicht wird dies jemand anderem helfen. Ich experimentierte etwas mehr und fand eine einfache Lösung, die zu funktionieren scheint.
Geben Sie einen einfachen Wert an (Zeichenfolge oder Ganzzahl, je nachdem, was der Typ der Auswahlliste ist), und benennen Sie ihn als Modellelement, an das Sie binden. Stellen Sie dann ein zweites Element als Auswahlliste zur Verfügung und benennen Sie es anders. Also mein Modell wurde:
public class DemoCreateViewModel
{
public string Choice { get; set; }
public SelectList Choices { get; set; }
}
Und dann die DropDownListFor Anweisung in der Ansicht wird:
<%= Html.DropDownListFor(model => model.Choice, Model.Choices) %>
Wenn ich dies tun, geben Sie die Taste richtig die Wahl in Form Wahl auf den String aus bindet, und übergibt das Modell an die zweite Create-Methode zurück.
Vielen Dank für Ihre Korrektur, ich hatte ein ähnliches Problem und Ihre Bearbeitung geholfen – Chris
Kannst du es nicht einfach an eine IEnumerable oder List of SelectListItems binden? –