/ / Model associando uma propriedade de coleção com uma visão parcial - c #, .net, asp.net-mvc, asp.net-mvc-4, model-binding

Vincule o modelo de uma propriedade de coleção com uma exibição parcial - c #, .net, asp.net-mvc, asp.net-mvc-4, model-binding

Suponha que eu tenha um modelo como este:

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

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

E eu quero uma visão de Foo que permite que os usuários editem Bar Unid. Mas com uma pegadinha: eu quero o Bar edição para ser tratada por uma vista parcial.

@model Web.ViewModels.Foo

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

o _EditBars visão parcial parece algo como:

@model List<Web.ViewModels.Bar>

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

Eu quero isso para vincular a minha ação, que se parece com algo como:

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

Infelizmente, esses são os dados que estou postando, que não modelam o bind Bars propriedade:

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

Faz sentido que isso não funcione, porque está faltando Bars prefixo. Se bem entendi, preciso que seja assim:

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

Então eu tentei essa abordagem:

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

Mas isso também não funciona. Com isso, estou ficando:

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

Eu suponho que isso não está funcionando por causa do período extra (Bars.[1] vs. Bars[1]). Existe alguma coisa que eu possa fazer para obter o resultado que desejo?

Nota: Esta é uma grande simplificação da minha situação atual. Eu reconheço que com algo tão simples, a melhor abordagem seria provavelmente fazer uma EditorTemplate para Bar e loop usando EditorFor na minha opinião. Se possível, eu gostaria de evitar essa solução.

Respostas:

3 para resposta № 1

Como você não quer usar um EditorTemplate para Bar, uma solução do seu cenário poderia ser:

Altere o tipo @model da exibição parcial "_EditBars" para Foo e a visualização deve ser como:

@model Foo

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

(Seria melhor mudar o nome da vista parcial para "_EditFooBars")

Espero que isto ajude.