Ich habe ein PersonEditorModel, das eine Liste von Personen enthält, die ich im Editor darstellen möchte. Ich habe eine Sammlung von Person-Objekten, die eine Sammlung von Address-Objekten enthält. Ich möchte für alle diese Textfelder rendern, damit der Benutzer Namen und Adressen bearbeiten kann, die diesen Namen zugeordnet sind.Sammlungsdaten werden nach dem Posten nicht in Modellen angezeigt. (Enthält Sammlungen von Sammlungen.)
class PersonEditorModel
{
public List<Person> People;
}
class Person
{
public string Name;
public List<Address> Addresses;
}
class Address
{
public string Value;
}
Ich erstelle ein Formular zum Bearbeiten der Adressen und die damit verbundenen Namen. Es verwendet Ajax.BeginForm, weil dies ein vereinfachtes Beispiel ist, das von einem Problem abgeleitet wurde, das ich in einer größeren App habe, wo das Formular einen anderen Teil der Seite mit Ajax aktualisiert, um ein Ergebnis zu erhalten.
In der cshtml Base Form:
@model Models.PersonEditorModel
@using (Ajax.BeginForm("Update", new AjaxOptions { HttpMethod = "Post" }))
{
<div>
@Html.EditorFor(x => x.People)
<button type="submit">Commit Changes</button>
</div>
}
Person.cshtml:
@model Models.Person
<div> @Html.TextBoxFor(x => x.Name) </div>
<div> @Html.EditorFor(x => x.Addresses) </div>
Address.cshtml:
@model Models.Address
<div> @Html.TextBoxFor(x => x.Value) </div>
der Methode der Steuerung für die Aktion:
public ActionResult Update(List<Person> people) { /* snip */ }
Wenn ich dieses Formular absende, zeigt ein Breakpoint sofort in Update(), dass "people" eine Liste der richtigen Länge ist, aber es enthält absolut keine Daten - alle Adressen sind leere Zeichenfolgen, obwohl die Formulardaten als erscheint in Request.Form sieht korrekt aus.
Was könnte solch ein Problem verursachen und was wäre ein idiomatischer MVC Weg, um dieses Problem zu lösen?
HINWEIS: Dies ist ein vereinfachtes Beispiel für ein Verhalten, das ich in einer komplexeren App sehe. Ich denke, ich habe die Essenz des Problems hier festgehalten, aber es könnte noch einen anderen unbekannten komplizierenden Faktor geben. Lassen Sie mich wissen, was dies komplizieren könnte, um das Problem zu verursachen, das ich sehe, und ich werde versuchen, irgendwelche zusätzlichen Details zur Verfügung zu stellen, die ich kann.
Ich habe versucht, Update nehmen Sie einen PersonEditorModel-Parameter statt, aber das bekommt absolut keine Daten überhaupt.
Arbeitete perfekt. Da ich Felder immer verwendet habe, wenn ich Eigenschaften ohne spezielle Get- oder Set-Logik verwenden würde, mische ich im Allgemeinen Eigenschaften mit dem Standard get und setze sie mit öffentlichen Feldern. Diese Annahme führte mich dazu, mental darüber hinweg zu gehen, dass Informationen über Modellbindung über Eigenschaften und nicht über Felder sprechen. Meine Praxis, Felder so oft zu benutzen, ist wahrscheinlich eine schlechte, die ich korrigieren sollte. – evizaer