Ich verwende ein Modell, das eine Liste als Eigenschaft enthält. Ich fülle diese Liste mit Elementen, die ich von SQL Server greife. Ich möchte, dass die Liste in der Ansicht ausgeblendet und an die POST-Aktion übergeben wird. Später möchte ich vielleicht mit jQuery weitere Elemente zu dieser Liste hinzufügen, wodurch ein Array für eine spätere Erweiterung ungeeignet wird. Normalerweise würden Sie verwenden
@Html.HiddenFor(model => model.MyList)
Um diese Funktionalität zu erreichen, ist die Liste im POST aus irgendeinem Grund immer null.
Sehr einfache Frage, weiß jemand, warum sich MVC so verhält?
c#
asp.net
asp.net-mvc-3
hidden-field
Anton Smith
quelle
quelle
<input />
s?MyList
enthält?HiddenFor
wird jeweils nur für einen Eingang verwendet.Model.MyList
? Möglicherweise müssen Sie Ihre Liste manuell serialisieren / deserialisieren.Antworten:
Ich bin gerade auf dieses Problem gestoßen und habe es einfach folgendermaßen gelöst:
Wenn Sie ein for anstelle eines foreach verwenden, funktioniert die Modellbindung ordnungsgemäß und nimmt alle Ihre versteckten Werte in der Liste auf. Scheint der einfachste Weg zu sein, um dieses Problem zu lösen.
quelle
@Html.HiddenFor(model => Model.ToGroups[i].RowId)
@Html.EditorFor(model => Model.ToGroups[i].Id)
gefolgt@Html.EditorFor(model => Model.ToGroups[i].Description)
- beide in der for-Schleife. Und der Controller konnte es einer Liste der Modelle mit diesen Feldern zuordnen. Und um sicherzustellen, dass nichts davon auf dem Bildschirm angezeigt wird, umgeben Sie es einfach in<div style="display: none;"></div>
for
Schleife in diese:for(int i = 0; i < Model.Departments.Count(); i++)
HiddenFor ist nicht wie DisplayFor oder EditorFor. Es funktioniert nicht mit Sammlungen, sondern nur mit einzelnen Werten.
Sie können den im MVC Futures-Projekt verfügbaren Serialize HTML-Helfer verwenden, um ein Objekt in ein ausgeblendetes Feld zu serialisieren, oder Sie müssen den Code selbst schreiben. Eine bessere Lösung besteht darin, einfach eine ID zu serialisieren und die Daten beim Postback erneut aus der Datenbank abzurufen.
quelle
Es ist ein bisschen wie ein Hack, aber wenn
@Html.EditorFor
oder@Html.DisplayFor
arbeiten Sie für Ihre Liste, wenn Sie sicherstellen möchten, dass sie auf der Post-Anfrage gesendet, aber nicht sichtbar ist, können Sie sie einfach so gestalten, dassdisplay: none;
sie stattdessen ausgeblendet wird, z.quelle
Wie wäre es mit Newtonsoft, um das Objekt in eine JSON-Zeichenfolge zu deserialisieren und diese dann in Ihr ausgeblendetes Feld einzufügen, z. B. ( Model.DataResponse.Entity.Commission ist eine Liste einfacher "CommissionRange" -Objekte, wie Sie im JSON sehen werden).
Rendert als:
In meinem Fall mache ich einige JS-Sachen, um den JSON im versteckten Feld zu bearbeiten, bevor ich ihn zurückschicke
In meinem Controller verwende ich dann erneut Newtonsoft, um Folgendes zu deserialisieren:
quelle
Html.HiddenFor
ist nur für einen Wert ausgelegt. Sie müssen Ihre Liste auf irgendeine Weise serialisieren, bevor Sie das ausgeblendete Feld erstellen.Wenn Ihre Liste beispielsweise vom Typ Zeichenfolge ist, können Sie die Liste zu einer durch Kommas getrennten Liste zusammenfügen und die Liste nach dem Zurücksenden in Ihrem Controller aufteilen.
quelle
Ich habe gerade herausgefunden (nach ein paar Stunden, in denen versucht wurde herauszufinden, warum Modellwerte nicht zum Controller zurückkehren), dass versteckt für den EditorFor folgen sollte.
Wenn ich nichts anderes falsch mache, habe ich das gefunden. Ich werde den Fehler nicht noch einmal machen.
Im Kontext eines Modells, das eine Liste einer anderen Klasse enthält.
Dies wird NICHT funktionieren:
Wo wie das wird ......
quelle
Ich habe angefangen, den Quellcode nach zu durchsuchen
HiddenFor
, und ich denke, die Straßensperre, die Sie sehen, ist, dass Ihr komplexes ObjektMyList
nicht implizit in Typ konvertierbar ist. Daherstring
behandelt das Framework IhrenModel
Wert alsnull
und macht dasvalue
Attribut leer.quelle
Sie können sich diese Lösung ansehen .
Fügen Sie nur HiddenFor in die EditorTemplate ein.
Und aus Ihrer Sicht setzen Sie dies:
@Html.EditorFor(model => model.MyList)
Es sollte funktionieren.
quelle
Konnte das gleiche Problem. Ohne for-Schleife wurde nur das erste Element der Liste veröffentlicht. Nach dem Durchlaufen der for-Schleife kann die vollständige Liste beibehalten und erfolgreich veröffentlicht werden.
quelle
Eine andere Option wäre:
quelle
Die
foreach
Schleife anstelle einerfor
Schleife könnte eine etwas sauberere Lösung sein.quelle
Eine andere Möglichkeit, dies zu beheben, besteht darin, jedem Objekt in Ihrer Liste eine ID zu geben und dann
@Html.DropDownListFor(model => model.IDs)
ein Array zu verwenden und zu füllen, das die IDs enthält.quelle
Vielleicht zu spät, aber ich habe eine Erweiterungsmethode für versteckte Felder aus der Sammlung erstellt (mit einfachen Datentypelementen):
Hier ist es also:
Die Verwendung ist so einfach wie:
quelle