2008-10-16 17 views
198

¿Cómo puedo tener una visión rinde un (control de usuario) parcial de una carpeta diferente? Con previsualización 3 Solía ​​llamar RenderUserControl con la ruta completa, pero un poco con la actualización a Vista previa 5 este ya no es posible. En su lugar tenemos el método RenderPartial, pero no me ofrece la funcionalidad que estoy buscando.Render parcial de carpeta diferente (no compartida)

Respuesta

370

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

Razor: Motor de

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

ASP.NET:

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

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

+13

Me gustaría poder decir simplemente/AnotherFolder/Mensajes –

+4

@Simon_Weaver Usted puede lograr eso. Una forma sería la de modificar y anular ViewEngine es 'método FindPartialView' con algo como' si partialViewName.Contains ("/") partialViewName = "~/Vistas /" + partialViewName; ' –

+2

Obras en el motor de la maquinilla de afeitar MVC 3, así, pero al igual que el anterior, necesita la extensión (.cshtml). – Chris

3

VirtualPathProviderViewEngine, en el que se basa WebFormsViewEngine, se supone que admite los caracteres "~" y "/" en la parte frontal de la ruta para que los ejemplos anteriores funcionen.

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. ¿Ha intentado

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

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

6

Para un control de usuario llamado myPartial.ascx situada en Vistas/Cuenta carpeta escribir así:

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

deberías probar este

~/Views/Shared/parts/UMFview.ascx 

lugar el ~/Views/ antes de su código

-4

Trate de usar RenderAction("myPartial","Account");

+3

Por favor Lea la pregunta que el usuario está preguntando por la vista de carpeta diferente, donde es la carpeta en su código? Del mismo modo – Pamma

3

he crear d una solución alternativa que parece funcionar bastante bien. He encontrado la necesidad de cambiar al contexto de un controlador diferente para la búsqueda de nombre de la acción, 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 forma en que se utiliza dentro de una vista es el siguiente:

@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 su código requiere el controller componente de ruta para no cambiar, pero en nuestro código hasta ahora, no parece haber ningún aspecto negativo en este enfoque.

18

En mi caso estaba usando MvcMailer (https://github.com/smsohan/MvcMailer) y quería acceder a una vista parcial desde otra carpeta, que no estaba en "Compartido". Las soluciones anteriores no funcionaron, pero utilizaron una ruta relativa sí.

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

@ Html.Partial ("../ Común/_PartialView") para utilizar la carpeta compartida. –

+6

estoy encontrando que esto no funciona sin la extensión .cshtml al final. – Luke

18

Si está utilizando esta otra ruta la mayor parte del tiempo, puede arreglar esto permanentemente sin tener que especificar la ruta todo el tiempo. De forma predeterminada, está verificando vistas parciales en la carpeta Ver y en la carpeta Compartido. Pero di que quieres agregar uno.

Añadir una clase a la carpeta de modelos:

public class NewViewEngine : RazorViewEngine { 

    private static readonly string[] NEW_PARTIAL_VIEW_FORMATS = new[] { 
     "~/Views/Foo/{0}.cshtml", 
     "~/Views/Shared/Bar/{0}.cshtml" 
    }; 

    public NewViewEngine() { 
     // Keep existing locations in sync 
     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NEW_PARTIAL_VIEW_FORMATS).ToArray(); 
    } 
} 

A continuación, en el archivo de Global.asax.cs, agregue la siguiente línea:

ViewEngines.Engines.Add(new NewViewEngine()); 
+3

Por supuesto, me doy cuenta de que esta pregunta fue hecha hace mucho tiempo. Pensé que lo agregaría para futuros Googlers y futuros Bingers. – Paul

Cuestiones relacionadas