Aggiunta di sottodirectory alla cartella “Visualizza / Condivisa” in ASP.Net MVC e chiamata alla vista

Attualmente sto sviluppando un sito utilizzando ASP.Net MVC3 con Razor. All’interno della cartella “Visualizza / Condivisa”, voglio aggiungere una sottocartella chiamata “Parziali” in cui posso posizionare tutte le mie viste parziali (per organizzare meglio il sito.

Posso farlo senza problemi fintanto che faccio sempre riferimento alla cartella “Parziali” quando chiami le viste (usando Razor):

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

La mia domanda è se c’è un modo per aggiungere la cartella “Partials” alla lista che .Net passa durante la ricerca di una vista, in questo modo posso chiamare la mia vista senza dover fare riferimento alla cartella “Parziali”, in questo modo:

 @Html.Partial("{ViewName}") 

Grazie per l’aiuto!

Risolto questo. Per aggiungere la sottodirectory “Shared / Partials” che ho creato all’elenco delle posizioni cercate quando si cerca di individuare una vista parziale in Razor usando:

 @Html.Partial("{NameOfView}") 

Per prima cosa create un motore di visualizzazione con RazorViewEngine come class base e aggiungete i punti di vista come segue. Ancora una volta, volevo memorizzare tutte le mie viste parziali in una sottodirectory “Partials” che ho creato all’interno della directory “Views / Shared” predefinita creata da 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(); } } 

Si noti che {1} nel formato della posizione è il nome del controller e {0} è il nome della vista.

Quindi aggiungi quel motore di visualizzazione alla raccolta MVC ViewEngines.Engines nel metodo Application_Start () nel tuo global.asax:

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

Grazie per le tue risposte. Questo ha organizzato la mia cartella condivisa, ma perché crei un nuovo tipo di motore di visualizzazione? Ho appena creato un nuovo RazorViewEngine , RazorViewEngine impostato PartialViewLocationFormats e l’ PartialViewLocationFormats aggiunto all’elenco di ViewEngines .

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

È bello personalizzare il motore di visualizzazione, ma se vuoi solo avere una sottocartella per partial non hai bisogno di così tanto …

Basta usare il percorso completo per la vista parziale, come fatto per la vista Layout:

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

Spero che aiuti qualcuno …

Ho aggiornato l’eccellente risposta di lamarant per includere le aree:

 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"); } } } 

Quindi non dimenticare di includere nell’avvio dell’applicazione:

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

È inoltre ansible aggiornare i formati partialview-location del RazorViewEngine registrato. Inserire il codice seguente in Application_Start in 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(); } 

È ansible creare la registrazione del proprio motore di visualizzazione che deriva da qualsiasi motore di visualizzazione utilizzato (Webform / Rasoio) e specificare le posizioni desiderate nel costruttore o aggiungerle all’elenco di posizioni già esistenti:

 this.PartialViewLocationFormats = viewLocations; 

Quindi all’avvio dell’applicazione aggiungerebbe il tuo motore di visualizzazione in questo modo: ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

Se stai facendo questo in ASP.NET Core, vai semplicemente alla class Startup, sotto il metodo ConfigureServices , e inserisci

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