Supposons que j'ai un modèle comme celui-ci:
public class Foo {
public List<Bar> Bars { get; set; }
public string Comment { get; set; }
}
public class Bar {
public int Baz { get; set; }
}
Et je veux une vue de Foo
qui permet aux utilisateurs de modifier Bar
articles. Mais avec une prise: je veux le Bar
l'édition à traiter par une vue partielle.
@model Web.ViewModels.Foo
@using(Html.BeginForm()) {
@Html.Partial("_EditBars", Model.Bars)
@Html.TextAreaFor(m => m.Comment)
...
}
le _EditBars
vue partielle ressemble à quelque chose comme:
@model List<Web.ViewModels.Bar>
@for (int i = 0; i < Model.Count; i++) {
@Html.EditorFor(m => Model[i].Baz)
}
Je veux que ce modèle soit lié à mon action, qui ressemble à ceci:
[HttpPost]
public ActionResult Edit(Foo foo) {
// Do stuff
}
Malheureusement, ce sont les données que je publie, qui ne lient pas le modèle avec le Bars
propriété:
[1].Baz=10&[0].Baz=5&Comment=bla
Il est logique que cela ne fonctionne pas, car il manque le Bars
préfixe. Si je comprends bien, il me faut ça:
Bars[1].Baz=10&Bars[0].Baz=5&Comment=bla
Alors j'ai essayé cette approche:
@Html.Partial(
"_EditBars",
Model.Bars,
new ViewDataDictionary(ViewData)
{
TemplateInfo = new TemplateInfo
{
HtmlFieldPrefix = "Bars"
}
})
Mais ça ne marche pas non plus. Avec ça, je reçois:
Bars.[1].Baz=10&Bars.[0].Baz=5&Comment=bla
Je suppose que cela ne fonctionne pas à cause du délai supplémentaire (Bars.[1]
contre. Bars[1]
). Y a-t-il quelque chose que je puisse faire pour obtenir le résultat souhaité?
Remarque: C'est une simplification excessive de ma situation actuelle. Je reconnais qu'avec quelque chose d'aussi simple, la meilleure approche serait probablement de faire un EditorTemplate
pour Bar
et boucle en utilisant EditorFor
à mon avis. Si possible, je voudrais éviter cette solution.
Réponses:
3 pour la réponse № 1Comme vous ne voulez pas utiliser un EditorTemplate
pour Bar
, une solution de votre scénario pourrait être:
Remplacez le type de modèle @ de la vue partielle "_EditBars" par Foo
et la vue devrait être comme:
@model Foo
@if (Model.Bars != null)
{
for (int i = 0; i < Model.Bars.Count; i++)
{
@Html.EditorFor(m => Model.Bars[i].Baz)
}
}
(Il serait préférable de changer le nom de la vue partielle en "_EditFooBars"
)
J'espère que cela t'aides.