/ / Model liant une propriété de collection avec une vue partielle - c #, .net, asp.net-mvc, asp.net-mvc-4, model-binding

Le modèle lie une propriété de collection avec une vue partielle - c #, .net, asp.net-mvc, asp.net-mvc-4, model-binding

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

Comme 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.