2012-03-30 6 views
1

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.

Antwort

1
class Address 
{ 
    public string Value; 
} 

sollte sein:

class Address 
{ 
    public string Value { get; set; } 
} 

Der Standardbinder Modell arbeitet mit Eigenschaften, keine Felder.

Stellen Sie außerdem sicher, dass die generierten Eingabefeldnamen standard convention entsprechen.

+0

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

0

Es scheint mir, dass Sie hier mindestens zwei Probleme haben, beide Modell-bezogen. Erstens wird das Objekt, das auf Ihren Aufruf gepostet wird, basierend auf den IDs der Eingabeelemente in der generierten Form automatisch erstellt. Zum Beispiel eine Eigenschaft zu extrahieren Personname genannt wird, es gäbe irgendwo ähnlich

<input type='whatever' id='PersonName' /> 

Da ein solcher Tag sein müssen, müssen diese Eigenschaften der Lage sein, über einen solchen Eingang dargestellt werden.

Das zweite Problem stammt aus diesem ersten.Mit MVCs eingebauten AJAX-Formularen (die im Vergleich zu AJAX im Allgemeinen (und in jQuery) begrenzt sind) gibt es keine Möglichkeit (zumindest ich), irgendwelche Sammlungen zu definieren, aber insbesondere nicht etwas so Generisches wie eine Liste. Um dies mit MVCs AJAX zu tun, müssten Sie wahrscheinlich einen Editor für jeweils eine Person/Benutzer implementieren und diese Daten (mit einer einzelnen oder aufgezählten Anzahl von Adressen) zurückgeben.

Sie können auch die Aktualisierung einer ganzen Gruppe von Personen über einen AJAX-Anruf überprüfen. Die dynamische Natur von AJAX eignet sich besser für kleinere, häufigere Updates.

+0

Ich habe keines dieser Probleme. Dies ist ein vereinfachtes Beispiel, das die Verwendung von AJAX nicht rechtfertigt, aber ich habe es in mein vereinfachtes Beispiel aufgenommen, weil ich dachte, dass es etwas mit dem vorliegenden Problem zu tun haben könnte. Die Eingaben werden bereits für mich durch die Verwendung von @ Html.TextBoxFor (x => x.Thing) erzeugt, wenn es also falsch generiert würde, wäre das ein Problem mit TextBoxFor/EditorFor und nicht mir. – evizaer