223 votos

Procesamiento parcial de carpeta diferente (no compartido)

¿Cómo puedo tener una vista rendir un parcial (control de usuario) de una carpeta diferente? Con preview 3 que solía llamar RenderUserControl con la ruta completa, pero whith actualizar a vista previa 5 esto ya no es posible. En su lugar tenemos el método RenderPartial, pero no me está ofreciendo la funcionalidad que busco.

402voto

Elijah Manor Puntos 8991

Sólo incluir la ruta a la vista, con la extensión de archivo.

Razor:

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

Motor de ASP.NET:

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

Si eso no es el problema, ¿podría por favor incluya su código que utiliza para trabajar con el RenderUserControl?

23voto

Aaron Sherman Puntos 526

En mi caso yo estaba usando MvcMailer (https://github.com/smsohan/MvcMailer) y quería acceder a una vista parcial de otra carpeta, eso no estaba en "Compartido". Las soluciones anteriores no funcionan, pero uso una ruta relativa.

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

6voto

Rahat Puntos 382

Para un control de usuario denominado myPartial.ascx ubicado en la carpeta Views/cuenta escribe así:

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

4voto

Jacob Puntos 33729

He creado una solución que parece estar funcionando muy bien. Me encontré con la necesidad de cambiar el contexto de un controlador diferente para la acción en la búsqueda del nombre, de la vista de búsqueda, etc. Para implementar esto, he creado un nuevo método de extensión para HtmlHelper:

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

ControllerContextRegion se define como:

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 manera en que se utiliza dentro de una vista es como sigue:

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

Puede haber efectos secundarios no deseados para esto si tu código requiere la controller ruta componente para no cambiar, pero en nuestro código hasta el momento, no parece ser cualquier negativos de este enfoque.

3voto

Andrew Nurse Puntos 4553

El VirtualPathProviderViewEngine, en que se basa la WebFormsViewEngine, se supone que es apoyar a los "~" y caracteres "/" en la parte delantera de la ruta de acceso para sus ejemplos anteriores deberían funcionar.

Me di cuenta de sus ejemplos utilizan el camino "~ / Cuenta / myPartial.ascx", pero mencionó que el control de usuario se encuentra en la carpeta Vistas / Cuenta. ¿Has probado

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

o es que sólo un error tipográfico en su pregunta?

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X