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++;
}
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.
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 } }
);
@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>
Je pense que cela devrait fonctionner non?
ViewData["currentIndex"] = index;
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.
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.
this.ViewData.Add ("index", index);
Html.RenderPartial ( "ProductImageForm", Image, This.ViewData );
Cela devrait aussi fonctionner.
Vous pouvez utiliser la variable dynamique ViewBag
ViewBag.AnotherValue = valueToView;