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.
Réponses
Trop de publicités?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?
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)
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.
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?