2013-03-09 6 views
5

Modello Supponiamo che io sono un modello come questo:vincolante una proprietà della raccolta con una vista parziale

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

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

E voglio una vista Foo che permette di creare Bar articoli. Ma con una presa: voglio che la modifica Bar sia gestita da una vista parziale.

@model Web.ViewModels.Foo 

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

Il _EditBars vista parziale sembra qualcosa di simile:

@model List<Web.ViewModels.Bar> 

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

Voglio che questo modellare legano alla mia azione, che sembra qualcosa di simile:

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

Purtroppo, questo è il dato che sto postando, che non modellizza la proprietà Bars:

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

Ha senso che questo non funziona, perché manca il prefisso Bars. Se ho capito bene, ho bisogno di essere questo:

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

Così, ho provato this approach:

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

Ma che non funziona neanche. Con questo, sto ottenendo:

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

suppongo che che non funziona a causa del tempo supplementare (Bars.[1] vs. Bars[1]). C'è qualcosa che posso fare per ottenere il risultato che desidero?

Nota: Questa è una semplificazione eccessiva della mia situazione attuale. Riconosco che con qualcosa di così semplice, l'approccio migliore sarebbe probabilmente quello di creare uno EditorTemplate per Bar e passare attraverso EditorFor nella mia vista. Se possibile, vorrei evitare questa soluzione.

+0

@gdp, modificato per mostrare la vista parziale e aggiunto una nota alla fine della mia domanda. Grazie! – Eric

+0

hai mai risolto alla fine? avere lo stesso problema – user3281466

+0

È passato un po 'di tempo, quindi non ricordo i dettagli, ma guardando i miei registri di commit, ho commesso qualcosa dopo aver posto questa domanda che ha fatto riferimento a questo: http://stackoverflow.com/questions/1488890/asp -net-mvc-partial-views-input-name-prefixes/6292180 # 6292180, che credo possa essere correlato. – Eric

risposta

3

Come non si desidera utilizzare un EditorTemplate per Bar, una soluzione del vostro scenario potrebbe essere:

Cambiare il tipo @model di vista parziale le '_EditBars' a Foo e vista come dovrebbe essere:

@model Foo 

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

(sarebbe meglio cambiare il nome della vista parziale al '_EditFooBars')

Spero che questo aiuti.

+0

Sarebbe una buona soluzione, grazie. – Eric

+0

-1 Funziona, ma non è riutilizzabile ed è un cattivo design. – Levitikon