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 № 1Como 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.