2011-02-11 12 views
46

Actualmente estoy desarrollando un sitio usando ASP.Net MVC3 con Razor. Dentro de la carpeta "Ver/Compartido", quiero agregar una subcarpeta llamada "Partials" donde puedo ubicar todas mis vistas parciales (con el fin de organizar mejor el sitio.Agregando subdirectorio a la carpeta "Ver/Compartido" en ASP.Net MVC y llamando a la vista

Puedo hacer esto sin ningún problema mientras que siempre hacer referencia a la carpeta "parciales" al llamar a los puntos de vista (usando la maquinilla de afeitar):

@Html.Partial("Partials/{ViewName}") 

mi pregunta es si hay una manera de añadir la carpeta "parciales" de la lista que pasa a través de .Net cuando buscando una vista, de esta manera puedo llamar a mi vista sin tener que hacer referencia a la carpeta "Partials", así:

@Html.Partial("{ViewName}") 

¡Gracias por la ayuda!

Respuesta

62

resuelto este. Para añadir el "Parciales compartido /" subdirectorio creé a la lista de ubicaciones buscó al intentar localizar una vista parcial en Razor usando:

@Html.Partial("{NameOfView}") 

En primer lugar crear un motor de visión con RazorViewEngine como su clase base y añadir sus ver ubicaciones de la siguiente manera. Una vez más, quería almacenar todas mis vistas parciales en un subdirectorio "Partials" que he creado dentro del directorio predeterminado "Vistas/Compartidas" creado por MVC.

public class RDDBViewEngine : RazorViewEngine 
{ 
    private static readonly string[] NewPartialViewFormats = 
    { 
     "~/Views/{1}/Partials/{0}.cshtml", 
     "~/Views/Shared/Partials/{0}.cshtml" 
    }; 

    public RDDBViewEngine() 
    { 
     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray(); 
    }  

} 

Tenga en cuenta que {1} en el formato de ubicación es el nombre del controlador y {0} es el nombre de la vista.

A continuación, añadir que a la vista del motor ViewEngines.Engines Colección MVC en el método Application Start() en su global.asax:

ViewEngines.Engines.Add(new RDDBViewEngine()); 
+0

Yo quería hacer lo mismo en mi proyecto. Gracias por la clara solución. – ses011

+0

+1 Gracias. Eso es realmente fácil de hacer eso. Y la forma correcta de crear una clase reutilizable :) – ppumkin

+0

¿Dónde agregas la clase "RDDBViewEngine" que hiciste en el paso 2? – Zapnologica

1

Puede crear registrar su propio motor de vista que se deriva de lo que sea motor de vista que está utilizando (Webforms/Razor) y especifique lo lugares que desea en el constructor o simplemente añadirlos a la lista de ubicaciones ya existentes:

this.PartialViewLocationFormats = viewLocations; 

Luego, en Inicio de aplicación deberá añadir el motor de su vista, así: ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

+0

No necesita heredar la clase. – SLaks

26

Gracias por sus respuestas. Esto ha organizado mi carpeta compartida, pero ¿por qué creas un nuevo tipo de motor de vista? Acabo de crear un nuevo RazorViewEngine, configuré PartialViewLocationFormats y lo agregué a la lista de ViewEngines.

ViewEngines.Engines.Add(new RazorViewEngine 
{ 
    PartialViewLocationFormats = new string[] 
    { 
     "~/Views/{1}/Partials/{0}.cshtml", 
     "~/Views/Shared/Partials/{0}.cshtml" 
    } 
}); 
+2

La creación de su propia clase le permitirá reutilizarla en el futuro en lugar de recordar escribir a mano esos literales de cadena cada vez. –

+0

Ambos enfoques funcionarán, y creo que cada uno tiene sus propios pros y contras. Para mí, esta es la mejor respuesta porque no estamos cambiando el comportamiento ya disponible en 'RazorViewEngine'. – Jaans

+0

Tenga en cuenta que puede ejecutar fácilmente el código en esta respuesta desde un método Helper, que captura esto solo una vez, en lugar de crear una clase adicional con solo este detalle. –

14

Está agradable a la costumbre del motor vista, pero si lo que desea es tener una subcarpeta POR parciales que no necesito tanto ...

sólo tiene que utilizar la ruta completa a la parcial punto de vista, como se hizo para la vista de diseño:

@Html.Partial("/Views/Shared/Partial/myPartial.cshtml") 

espero que ayude a alguien ...

+0

¡Gracias, solución realmente simple y FUNCIONAL! –

+4

Para MVC 5, simplemente ponga @ Html.Partial ("Partial/myPartial.cshtml") – Santosh

5

también puede actualizar los PartialView-location-formatos de la RazorViewEngine registrado. Coloque el código siguiente en Application_Start en Global.asax.

RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault(); 
     if (razorEngine != null) 
     { 
      string[] newPartialViewFormats = new[] { 
        "~/Views/{1}/Partials/{0}.cshtml", 
        "~/Views/Shared/Partials/{0}.cshtml" 
      }; 
      razorEngine.PartialViewLocationFormats = 
       razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray(); 
     } 
6

He actualizado excelente respuesta de lamarant incluir Áreas:

public class RDDBViewEngine : RazorViewEngine 
{ 
    private static readonly string[] NewPartialViewFormats = 
    { 
     "~/Views/{1}/Partials/{0}.cshtml", 
     "~/Views/Shared/Partials/{0}.cshtml" 
    }; 

    private static List<string> AreaRegistrations; 

    public RDDBViewEngine() 
    { 
     AreaRegistrations = new List<string>(); 

     BuildAreaRegistrations(); 

     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray(); 
     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(areaRegistrations).ToArray(); 
    } 

    private static void BuildAreaRegistrations() 
    { 
     string[] areaNames = RouteTable.Routes.OfType<Route>() 
      .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area")) 
      .Select(r => r.DataTokens["area"].ToString()).ToArray(); 

     foreach (string areaName in areaNames) 
     { 
      AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml"); 
      AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml"); 
     } 
    } 
} 

Entonces no olvide incluir en su inicio de la aplicación:

public class MvcApplication : System.Web.HttpApplication 
{ 

    protected void Application_Start() 
    { 
     ... 

     ViewEngines.Engines.Add(new RDDBViewEngine()); 
    } 
} 
+0

Hice esto pero estoy obteniendo una 'ArgumentNullException' en' virtualPath', ¿qué estoy equivocado? – Phate01

1

si usted está haciendo esto en ASP.NET Core, simple vaya a la clase de Inicio, bajo el método ConfigureServices, y ponga

services.AddMvc() 
    .AddRazorOptions(opt => { 
     opt.ViewLocationFormats.Add("/Views/{1}/Partials/{0}.cshtml"); 
     opt.ViewLocationFormats.Add("/Views/Shared/Partials/{0}.cshtml"); 
    }); 
Cuestiones relacionadas