web-dev-qa-db-fra.com

Rendu Partiel d'une vue d'un autre contrôleur (et dans un autre dossier)

J'ai deux entités de base de données que je dois représenter et j'ai besoin de les produire sur une seule page.

J'ai quelque chose comme ça

Vues Def ViewA ViewB Test ViewC

Je veux ViewC pour afficher ViewA, qui affiche ViewB.

En ce moment, j'utilise quelque chose comme ça:

// View C
<!-- bla -->
<% Html.RenderPartial(Url.Content("../Definition/DefinitionDetails"), i); %>


// View A
<!-- bla -->
<% Html.RenderPartial(Url.Content("../Definition/DefinitionEditActions")); %>

Y a-t-il un meilleur moyen de le faire? Je trouve que la liaison avec des chemins d'accès relatifs peut vous brûler. Des conseils?

Toute chance que je puisse faire quelque chose comme ...

Html.RenderPartial ("Définition", "DefinitionDetails", i); ?

Merci pour l'aide

26
George Silva

cela fonctionne pour moi!

@Html.Partial("~/Views/NewsFeeds/NewsFeedPartial.cshtml")
46

Vous pouvez vous référer aux vues avec des chemins complets, comme:

Html.RenderPartial("~/Views/Definition/DefinitionDetails")

Encore mieux, utilisez la bibliothèque T4MVC , qui fait ce qui précède et la rend (quasi-) fortement typée. Vous pouvez vous référer à n'importe quelle vue depuis n'importe quel contrôleur ou vue. Vous l'utilisez comme ceci:

Html.RenderPartial(MVC.Definition.Views.DefinitionDetails)

ou

Html.RenderPartial(MVC.Definition.Views.DefinitionDetails, myModel)
34
Matt Sherman

Juste pour clarifier quelles options fonctionnent exactement:

1) L'extension du fichier de vue est obligatoire si vous fournissez un chemin.

2) Si vous ne fournissez pas de chemin, ne fournissez pas l'extension.

Les exemples ci-dessous supposent des fichiers cshtml.

Utilisez RenderPartial dans un bloc de code:

// This looks in default view folder, then shared, checking for .aspx, .cshtml etc
Html.RenderPartial("DefinitionDetails"); 

// This looks in specified path and requires the extension
Html.RenderPartial("~/Views/Definition/DefinitionDetails.cshtml");

Utilisez Partial pour la syntaxe Razor en ligne:

// This looks in default view folder, then shared, checking for .aspx, .cshtml etc
@Html.Partial("DefinitionDetails")

// This looks in specified path and requires the extension
@Html.Partial("~/Views/Definition/DefinitionDetails.cshtml")

Remarque: Apparemment, RenderPartial est légèrement plus rapide que Partial, mais je m'attends également à ce que les noms à chemin complet soient plus rapides que de laisser MVC rechercher le fichier.

Si vous produisez des partiels en boucle (c'est-à-dire à partir d'une collection dans votre modèle de vue), il est probable que vous devrez passer par des modèles de vue spécifiques:

par exemple.

   @foreach (var group in orderedGroups)
   {
       Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", group);
   }

Je devais juste faire tout cela sur un projet et j'ai trouvé la réponse marquée un peu trompeuse.

10
Gone Coding

Pourriez-vous ne pas copier les partiels dans le dossier partagé, alors faites simplement:

<% Html.RenderPartial("DefinitionDetails", i); %> et

<% Html.RenderPartial("DefinitionEditActions"); %>

1
ridecar2