280 votes

Rendu partiel à partir d'un autre dossier (non partagé)

Comment puis-je afficher une vue partielle (contrôle utilisateur) dans un autre dossier? Avec preview 3, j'avais l'habitude d'appeler RenderUserControl avec le chemin complet, mais avec la mise à niveau vers la prévisualisation 5, ce n'est plus possible. Au lieu de cela, nous avons obtenu la méthode RenderPartial, mais elle ne me propose pas les fonctionnalités que je recherche.

487voto

Elijah Manor Points 8991

Il suffit d'inclure le chemin d'accès à la vue, avec l'extension du fichier.

Le rasoir:

 @Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
 

Moteur ASP.NET:

 <% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
 

Si ce n'est pas votre problème, pourriez-vous s'il vous plaît inclure votre code qui fonctionnait avec le RenderUserControl?

37voto

Aaron Sherman Points 526

Dans mon cas, j'utilisais MvcMailer (https://github.com/smsohan/MvcMailer) et souhaitais accéder à une vue partielle à partir d'un autre dossier, qui n'était pas dans «Shared». Les solutions ci-dessus ne fonctionnaient pas, mais en utilisant un chemin relatif.

 @Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
 

7voto

Rahat Points 382

Pour un contrôle utilisateur nommé myPartial.ascx situé dans le dossier Views / Account, écrivez comme ceci:

 <%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
 

5voto

Jacob Points 33729

J'ai créé une solution qui semble fonctionner assez bien. J'ai trouvé la nécessité de basculer vers le contexte d'un contrôleur différent pour le nom de l'action de recherche, en vue de recherche, etc. Pour ce faire, j'ai créé une nouvelle méthode d'extension pour HtmlHelper:

public static IDisposable ControllerContextRegion(
    this HtmlHelper html, 
    string controllerName)
{
    return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}

ControllerContextRegion est défini comme:

internal class ControllerContextRegion : IDisposable
{
    private readonly RouteData routeData;
    private readonly string previousControllerName;

    public ControllerContextRegion(RouteData routeData, string controllerName)
    {
        this.routeData = routeData;
        this.previousControllerName = routeData.GetRequiredString("controller");
        this.SetControllerName(controllerName);
    }

    public void Dispose()
    {
        this.SetControllerName(this.previousControllerName);
    }

    private void SetControllerName(string controllerName)
    {
        this.routeData.Values["controller"] = controllerName;
    }
}

La façon dont il est utilisé à l'intérieur d'un point de vue est comme suit:

@using (Html.ControllerContextRegion("Foo")) {
    // Html.Action, Html.Partial, etc. now looks things up as though
    // FooController was our controller.
}

Il peut y avoir des effets secondaires indésirables pour cette si votre code requiert l' controller route des de la composante à ne pas changer, mais dans notre code pour l'instant, on n'a pas l'air d'être négatifs de cette approche.

4voto

Andrew Nurse Points 4553

Le VirtualPathProviderViewEngine, sur lequel WebFormsViewEngine est basé, est supposé supporter les caractères "~" et "/" au début du chemin afin que vos exemples ci-dessus fonctionnent.

J'ai remarqué que vos exemples utilisent le chemin "~ / Account / myPartial.ascx", mais vous avez mentionné que votre contrôle utilisateur se trouve dans le dossier Views / Account. As-tu essayé

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

ou est-ce juste une faute de frappe dans votre question?

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