Agregar subdirectorio a la carpeta “Ver / Compartido” en ASP.Net MVC y llamar a la vista

Actualmente estoy desarrollando un sitio usando ASP.Net MVC3 con Razor. Dentro de la carpeta “Ver / Compartido”, quiero agregar una subcarpeta llamada “Parciales” donde puedo colocar todas mis vistas parciales (por el bien de organizar mejor el sitio).

Puedo hacer esto sin problemas siempre que siempre haga referencia a la carpeta “Partials” cuando llamo a las vistas (usando Razor):

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

Mi pregunta es si hay una manera de agregar la carpeta “Partials” a la lista que .Net realiza al buscar 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!

Resuelto esto Para agregar el subdirectorio “Compartidos / Parciales” que creé a la lista de ubicaciones buscadas al intentar ubicar una Vista parcial en Razor usando:

 @Html.Partial("{NameOfView}") 

Primero crea un motor de vistas con RazorViewEngine como su clase base y agrega las ubicaciones de tus vistas 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, agregue ese motor de vista a MVC ViewEngines.Engines Collection en el método Application_Start () en su global.asax:

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

Gracias por sus respuestas. Esto ha organizado mi carpeta compartida, pero ¿por qué creas un nuevo tipo de motor de vista? Acabo de RazorViewEngine 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" } }); 

Es agradable personalizar el motor de visualización, pero si solo quieres tener una subcarpeta por parciales, no necesitas tanto …

Simplemente use la ruta completa a la vista parcial, como se hizo para la Vista de diseño:

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

Espero que ayude a alguien …

He actualizado la excelente respuesta de lamarant para incluir Áreas:

 public class RDDBViewEngine : RazorViewEngine { private static readonly string[] NewPartialViewFormats = { "~/Views/{1}/Partials/{0}.cshtml", "~/Views/Shared/Partials/{0}.cshtml" }; private static List AreaRegistrations; public RDDBViewEngine() { AreaRegistrations = new List(); BuildAreaRegistrations(); base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray(); base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(areaRegistrations).ToArray(); } private static void BuildAreaRegistrations() { string[] areaNames = RouteTable.Routes.OfType() .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 olvides incluirlo en el inicio de tu aplicación:

 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { ... ViewEngines.Engines.Add(new RDDBViewEngine()); } } 

También puede actualizar partialview-location-formats del RazorViewEngine registrado. Coloque el código siguiente en Application_Start en Global.asax.

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

Puede crear registrar su propio motor de visualización que se deriva de cualquier motor de visualización que esté usando (Formas web / Razor) y especificar las ubicaciones que desee en el constructor o simplemente agregarlas a la lista de ubicaciones ya existentes:

 this.PartialViewLocationFormats = viewLocations; 

Luego, en el inicio de la aplicación, debería agregar su motor de vista de la siguiente manera: ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

Si está haciendo esto en ASP.NET Core, simple vaya a la clase de Inicio, en 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"); });