2012-09-05 7 views
6

Ich habe zwei Modelle:Liste der Modelle bei Model in MVC

class ModelIn{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
} 

class ModelOut{ 
    public ModelOut(){ People = new List<ModelIn>();} 
    public List<ModelIn> People { get; private set;} 
    public string Country { get; set; } 
} 

Und ich habe ModelOut Controller-Bearbeitung:

public ActionResult People() 
{ 
    ... 
    return View(SomeModelOutInstanceWith3People); 
} 
[HttpPost] 
public ActionResult(ModelOut items) 
{ 
    ... 
} 

In Anbetracht Ich habe etw mag:

<% using (Html.BeginForm()) { %> 
    <%: Html.EditorFor(m => Model.Country) %> 
    <% for(int i = 0; i < Model.People.Count; ++i){ %> 
     <%: Html.EditorFor(m => Model.People[i].FirstName) %> 
     <%: Html.EditorFor(m => Model.People[i].LastName) %> 
     <%: Html.EditorFor(m => Model.People[i].Address) %> 
    <% } %> 
    <input type="submit" /> 
<% } %> 

Es funktioniert alles in Ordnung, aber in Post-Aktion habe ich leere ModelOut Elemente. Ich kann in Protokollen sehen, dass Daten korrekt gesendet werden.

Ich habe alles versucht, nichts funktioniert.

+0

Alles funktionierte gut, wenn ich IList anstelle von ModelOut hatte – Ari

+2

Versuchen Sie, es zu "öffentlichen ActionResult People (ModelOut Modell)" statt nur 'm' umzubenennen. MVC kann bei Parameternamen wählerisch sein. – Dai

+0

@David Param Name ist Elemente. Ich habe diesen Namen, als es mit der Liste arbeitete, also denke ich, dass das Problem anderswo sein muss – Ari

Antwort

0

@Dai hatte Recht. Mit MVC kann ich Elemente für den Namen der Modellinstanz verwenden, wenn es sich um eine Instanz von List handelt, aber ich kann sie nicht für ModelOut verwenden.

Nach der Umbenennung items zu model funktioniert es gut.

0

Der Grund für Ihr Problem könnte ein Namenskonflikt sein ... von dem, was ich erinnere das Standardmodell Bindemittel nicht seine Arbeit richtig wegen dieser Namenskonflikt .... das bedeutet, dass Sie mehr Informationen zu geben müssen Modell Binder seine Arbeit besser zu machen ... versuchen Sie, Ihre Ansicht Code zu aktualisieren den Code unten für jede Eigenschaft zu verwenden ...

<%= Html.EditorFor(string.Format("People[{0}].FirstName", i), Model.People[i].FirstName) %> 

Der obige Code-Ansicht wird das folgende Markup

<input id="People_0__FirstName" name="People[0].FirstName" type="text" /> 

I erzeugen könnte oben ein syntaktisches Problem haben, aber ich denke, dass Sie es riggen können ht mit der Hilfe von Visual Studio

+0

Es ist genau das, was mein Code generiert hat. '' – Ari

+0

ok ... jetzt da wir wissen, dass die Markierung nicht falsch ist..können Sie Ihren vollständigen Ansichtscode so veröffentlichen wie ... einschließlich der Layout- und Modellspezifikationen? Ich habe auch Ihr Szenario ausprobiert und es hat einfach gut funktioniert ... also muss da draußen etwas sein, das verhindert, dass das Modellbinder Daten bindet ... – NiK

+0

Es ist gelöst.Sehen Sie sich die Kommentare unter der Frage – Ari

1

Haben Sie versucht einfach <%: Html.EditorFor(m => m.People) %>?

MVC sollte die Liste selbst durchlaufen.

Achten Sie auch darauf, wie Sie Ihre Lambdas angeben, sollte es m => m statt m => Model sein.

PS. Ich benutze MVC3 ...

+0

an Ich muss durchschleifen, weil Editoren nicht nur Code sind, den ich dort brauche. In meinem Code habe ich 'm => m ...', habe ich mit Fehler neu geschrieben. – Ari

+1

Sie könnten diesen anderen Code in eine benutzerdefinierte Editorvorlage einfügen ... –