MVC Form kann keine Liste von Objekten veröffentlichen
so, ich habe eine MVC Asp.net app, die Probleme hat. Im wesentlichen habe ich eine Ansicht, die ein Formular enthält, und dessen Inhalt sind gebunden, um eine Liste von Objekten. Innerhalb dieser Schleife, lädt PartialView mit der die Elemente geloopt über. Jetzt funktioniert alles, bis auf die submittion der form. Wenn es vorgelegt wird, der controller wird geschickt eine null-Liste von Objekten. Der code unten demonstates die Probleme.
Übergeordneten Ansicht:
@model IEnumerable<PlanCompareViewModel>
@using (Html.BeginForm("ComparePlans", "Plans", FormMethod.Post, new { id = "compareForm" }))
{
<div>
@foreach (var planVM in Model)
{
@Html.Partial("_partialView", planVM)
}
</div>
}
_partialView:
@model PlanCompareViewModel
<div>
@Html.HiddenFor(p => p.PlanID)
@Html.HiddenFor(p => p.CurrentPlan)
@Html.CheckBoxFor(p => p.ShouldCompare)
<input type="submit" value="Compare"/>
</div>
, Und diese sind die Klassen für den obigen code:
PlanViewModel:
public class PlansCompareViewModel
{
public int PlanID { get; set; }
public Plan CurrentPlan { get; set; }
public bool ShouldCompare { get; set; }
public PlansCompareViewModel(Plan plan)
{
ShouldCompare = false;
PlanID = plan.PlanId;
CurrentPlan = plan;
}
public PlansCompareViewModel()
{
//TODO: Complete member initialization
}
public static IEnumerable<PlansCompareViewModel> CreatePlansVM(IEnumerable<Plan> plans)
{
return plans.Select(p => new PlansCompareViewModel(p)).AsEnumerable();
}
}
Controller:
public class PlansController : MyBaseController
{
[HttpPost]
public ActionResult ComparePlans(IEnumerable<PlanCompareViewModel> model)
{
//the model passed into here is NULL
}
}
Ist das problem in der controller-action. Soweit ich informiert bin, sollte sein posting eine aufzählbare Liste von PlanCompareViewModels, aber es ist null. Wenn Sie in inspect die post-Daten gesendet werden, es ist das senden der richtigen Parameter. Und wenn ich zu ändern 'IEnumerable' zu 'FormCollection', es enthält die richtigen Werte. Kann jemand sehen, warum das Bindemittel ist nicht das richtige Objekt? Ich kann um diese mit Hilfe von javascript, sondern dass Niederlagen der Zweck! Jede Hilfe wäre sehr geschätzt werden!
InformationsquelleAutor der Frage Sonoilmedico | 2013-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Modell ist
null
weil die Art und Weise Sie die Versorgung der Eingänge zu Ihrer form bedeutet, dass das Modell binder hat keine Möglichkeit zu unterscheiden zwischen den Elementen. Jetzt diesen code:ist nicht die Bereitstellung der Art von index auf die Elemente. So würde es immer wieder erzeugen der HTML-Ausgabe wie diese:
Jedoch, wie Sie wollen, sind zu binden, um eine Sammlung, die Sie benötigen, Formular-Elemente, die benannt werden mit einem index, wie zum Beispiel:
Dass index, was ermöglicht das Modell binder Verbindung der getrennten Teile der Daten, so dass es zu konstruieren, das richtige Modell. Also hier ist was ich würde vorschlagen, Sie tun, um es zu beheben. Statt Schleifen über Ihre Sammlung, durch Verwendung eines partiellen view, nutzen Sie die power von Vorlagen statt. Hier sind die Schritte, die Sie brauchen, um zu Folgen:
EditorTemplates
- Ordner in Ihrem Blick den aktuellen Ordner (z.B. wenn Ihre Sicht istHome\Index.cshtml
ist, erstellen Sie den OrdnerHome\EditorTemplates
).PlanCompareViewModel.cshtml
.Nun, alles, was Sie haben in Ihrem Teilansicht will in dieser Vorlage:
Endlich, Ihre übergeordnete Ansicht ist vereinfacht dieser:
DisplayTemplates
undEditorTemplates
klug genug, um zu wissen, wenn Sie Umgang mit Sammlungen. Das heißt, Sie werden automatisch zu generieren die korrekten Namen, einschließlich Indizes, für Formular-Elemente, so dass Sie richtig Modell binden an eine Auflistung.InformationsquelleAutor der Antwort John H
Bitte Lesen Sie diese: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
Sollten Sie Indizes für Ihre html-Elemente "name" - Attribute, wie
planCompareViewModel[0].PlanId
,planCompareViewModel[1].PlanId
zu machen, binder in der Lage zu analysieren, Sie in IEnumerable-Schnittstelle.Statt
@foreach (var planVM in Model)
verwendenfor
loop-und render-Namen mit Indizes.InformationsquelleAutor der Antwort LINQ2Vodka