web-dev-qa-db-fra.com

Passer des données View supplémentaires à une vue partielle fortement typée

J'ai une vue partielle fortement typée qui prend une ProductImage et quand elle est rendue, je voudrais également lui fournir quelques ViewData supplémentaires que je crée dynamiquement dans la page qui les contient. Comment puis-je passer mon objet fortement typé et mon ViewData personnalisé à 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++;
}
157
Nathan Taylor

RenderPartial prend un autre paramètre qui est simplement un ViewDataDictionary. Vous y êtes presque, appelez ça comme ça:

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

Notez que cela remplacera le 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.

224
womp

Pour étendre ce que womp a posté, vous pouvez transmettre de nouvelles données de vue tout en conservant les données de vue existantes si vous utilisez la surcharge de constructeur de la variable ViewDataDictionary comme ceci:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 
147
ctorx
@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>
38
muthuvel

Je pense que cela devrait fonctionner non?

ViewData["currentIndex"] = index;
8
Joel Martinez

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

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

Dans la vue, assurez-vous d’hériter de votre nouvelle classe et modifiez les éléments de code qui seront désormais erronés. à savoir les références à vos champs.

J'espère que cela t'aides. Sinon, faites le moi savoir et je posterai un code spécifique.

6
griegs

Le moyen le plus simple de transmettre des données supplémentaires consiste à ajouter les données à ViewData existant pour la vue sous la forme de notes @Joel Martinez. Cependant, si vous ne voulez pas polluer vos ViewData, RenderPartial a une méthode qui prend trois arguments ainsi que la version à deux arguments que vous affichez. Le troisième argument est un ViewDataDictionary. Vous pouvez créer un ViewDataDictionary distinct pour votre partiel, contenant uniquement les données supplémentaires que vous souhaitez transmettre.

4
tvanfosson

this.ViewData.Add ("index", index);

Html.RenderPartial ( "ProductImageForm", Image, This.ViewData ); 

Cela devrait aussi fonctionner.

0
MithunChopda

Vous pouvez utiliser la variable dynamique ViewBag

ViewBag.AnotherValue = valueToView;
0
Jack1987