2013-03-09 6 views
5

Angenommen, ich habe ein Modell wie folgt aus:Modell eine Sammlung Eigenschaft mit einer Teilansicht Bindung

public class Foo { 
    public List<Bar> Bars { get; set; } 
    public string Comment { get; set; } 
} 

public class Bar { 
    public int Baz { get; set; } 
} 

Und ich möchte einen Blick auf Foo die Bar Artikel Benutzer bearbeiten können. Aber mit einem Haken: Ich möchte die Bar Bearbeitung von einer Teilansicht behandelt werden.

@model Web.ViewModels.Foo 

@using(Html.BeginForm()) { 
    @Html.Partial("_EditBars", Model.Bars) 
    @Html.TextAreaFor(m => m.Comment) 
    ... 
} 

Die _EditBars Teilansicht etwas wie folgt aussieht:

@model List<Web.ViewModels.Bar> 

@for (int i = 0; i < Model.Count; i++) { 
    @Html.EditorFor(m => Model[i].Baz) 
} 

ich diese binden an meine Aktion zu modellieren, die wie etwas aussieht:

[HttpPost] 
public ActionResult Edit(Foo foo) { 
    // Do stuff 
} 

Leider ist dies die Daten dass ich schreibe, die nicht modelliert bindet die Bars Eigenschaft:

[1].Baz=10&[0].Baz=5&Comment=bla 

Es macht Sinn, dass dies nicht funktioniert, weil es das Bars Präfix fehlt. Wenn ich richtig verstehe, muss ich es, dies sein:

Bars[1].Baz=10&Bars[0].Baz=5&Comment=bla 

Also habe ich versucht, this approach:

@Html.Partial(
    "_EditBars", 
    Model.Bars, 
    new ViewDataDictionary(ViewData) 
    { 
     TemplateInfo = new TemplateInfo 
     { 
      HtmlFieldPrefix = "Bars" 
     } 
    }) 

Aber das ist auch nicht arbeiten. Damit erhalte ich:

Bars.[1].Baz=10&Bars.[0].Baz=5&Comment=bla 

Ich gehe davon aus, dass das nicht wegen der zusätzlichen Zeit arbeitet (Bars.[1] vs. Bars[1]). Kann ich etwas tun, um das gewünschte Ergebnis zu erzielen?

Hinweis: Dies ist eine große Vereinfachung meiner tatsächlichen Situation. Ich erkenne, dass mit etwas so einfach, wäre der beste Ansatz wahrscheinlich eine 10 für Bar und Loop-Through mit EditorFor meiner Ansicht nach. Wenn möglich, möchte ich diese Lösung vermeiden.

+0

@ Gdp, bearbeitet, um die Teilansicht anzuzeigen, und eine Notiz an den unteren Rand meiner Frage hinzugefügt. Vielen Dank! – Eric

+0

hast du es jemals am Ende gelöst? Das gleiche Problem – user3281466

+0

Es ist eine Weile her, so erinnere ich mich nicht an die Details, aber mit Blick auf meine Commit-Protokolle, habe ich etwas nach dem Stellen dieser Frage, die auf diese verwiesen: http://stackoverflow.com/questions/1488890/asp -net-mvc-partial-views-input-name-prefixes/6292180 # 6292180, die ich glaube, kann verwandt sein. – Eric

Antwort

3

Wie Sie nicht ein EditorTemplate für Bar verwenden möchten, könnte eine Lösung Ihres Szenarios sein:

Ändern der @model Art der Teilansicht ‚_EditBars‘ zu Foo und Ansicht sollte wie:

@model Foo 

@if (Model.Bars != null) 
{ 
    for (int i = 0; i < Model.Bars.Count; i++) 
    { 
     @Html.EditorFor(m => Model.Bars[i].Baz) 
    } 
} 

(Es wäre besser, die Teilansicht des Namens '_EditFooBars' zu ändern)

das hilft

Hoffnung.

+0

Das wäre eine gute Lösung, danke. – Eric

+0

-1 Es funktioniert, aber es ist nicht wiederverwendbar und ist schlechtes Design. – Levitikon