184 votes

Transmettre des données d'affichage supplémentaires à une vue partielle fortement typée

J'ai une vue partielle fortement typé qui prend un ProductImage et quand il est rendu, je voudrais aussi lui fournir quelques ViewData supplémentaires que je crée dynamiquement dans la page qui le contient. Comment puis-je transmettre à la fois mon objet fortement typé et mes ViewData personnalisées à la vue partielle avec l'appel RenderPartial ?

var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
{
  Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
  index++;
}

262voto

womp Points 71924

RenderPartial prend un autre paramètre qui est simplement un ViewDataDictionary. Vous y êtes presque, il suffit de l'appeler comme ceci :

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary { { "index", index } }
); 

Notez que cela remplacera les ViewData par défaut que toutes vos autres vues ont par défaut. Si vous ajoutez quelque chose à ViewData, ce ne sera pas dans ce nouveau dictionnaire que vous passerez à votre vue partielle.

3 votes

J'essaie de le faire et le résultat est "cannot convert void to object".

4 votes

@programad Essayez de supprimer le @ de @Html.RenderPartial(), cela a réglé le problème pour moi, mais j'appelais RenderPartial() sur une ligne dans un bloc de code @ { }.

6 votes

Je vous recommande de consulter la réponse de ctorx ci-dessous. Il ajoute des données supplémentaires à la ViewData existante.

173voto

ctorx Points 2684

Pour prolonger ce que womp a posté, vous peut transmettre de nouvelles données d'affichage tout en conservant les données d'affichage existantes si vous utilisez la surcharge du constructeur de la fonction ViewDataDictionary comme ça :

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
);

4 votes

Cela peut être très utile si vous avez besoin de retenir TemplateInfo.HtmlFieldPrefix dans le contrôle enfant qui sera réinitialisé sinon

13 votes

C'est certainement la meilleure solution. Perdre les ViewData signifie que vous perdez le ModelState et toutes les validations. +1

0 votes

Cela semble fonctionner uniquement si vous ne passez pas un TemplateInfo.HtmlFieldPrefix dans votre ViewDataDictionary. Je peux seulement passer une variable comme illustré dans la réponse, ou passer un TemplateInfo.HtmlFieldPrefix mais pas les deux.

49voto

muthuvel Points 89
@Html.Partial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } })
or
@{Html.RenderPartial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } });}

Page partielle (_Header) :

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>

2 votes

Cela semble être la réponse la plus complète (bien que le .ToString() soit inutile).

11voto

Joel Martinez Points 22924

Je pense que cela devrait fonctionner non ?

ViewData["currentIndex"] = index;

7 votes

Bien que cette méthode ne soit pas très efficace, elle m'a permis de comprendre comment récupérer une valeur de données de vue dans la réponse de Womp.

6voto

griegs Points 14142

Créez une autre classe qui contient votre classe fortement typée.

Ajoutez vos nouveaux éléments à la classe et renvoyez-les dans la vue.

Ensuite, dans la vue, assurez-vous d'hériter de votre nouvelle classe et de modifier les parties de code qui seront maintenant en erreur, à savoir les références à vos champs.

J'espère que cela vous aidera. Si ce n'est pas le cas, faites-le moi savoir et je posterai un code spécifique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X