Ajouter un sous-répertoire au dossier «View / Shared» dans ASP.Net MVC et appeler la vue

Je développe actuellement un site utilisant ASP.Net MVC3 avec Razor. Dans le dossier “View / Shared”, je souhaite append un sous-dossier appelé “Partials” où je peux placer toutes mes vues partielles (pour mieux organiser le site).

Je peux le faire sans problème tant que je fais toujours référence au dossier “Partials” lors de l’appel des vues (avec Razor):

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

Ma question est la suivante: y a-t-il un moyen d’append le dossier “Partials” à la liste parcourue par .Net lors de la recherche d’une vue, de cette manière je peux appeler ma vue sans avoir à référencer le dossier “Partials”, comme ceci:

 @Html.Partial("{ViewName}") 

Merci pour l’aide!

Résolu ce. Pour append le sous-répertoire “Partagé / Partagé” que j’ai créé à la liste des emplacements recherchés lorsque vous tentez de localiser une vue partielle dans Razor en utilisant:

 @Html.Partial("{NameOfView}") 

Commencez par créer un moteur de vue avec RazorViewEngine comme classe de base et ajoutez les emplacements de vos vues comme suit. Encore une fois, je voulais stocker toutes mes vues partielles dans un sous-répertoire “Partials” que j’ai créé dans le répertoire par défaut “Views / Shared” créé par MVC.

 public class RDDBViewEngine : RazorViewEngine { private static readonly ssortingng[] NewPartialViewFormats = { "~/Views/{1}/Partials/{0}.cshtml", "~/Views/Shared/Partials/{0}.cshtml" }; public RDDBViewEngine() { base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray(); } } 

Notez que {1} dans le format d’emplacement correspond au nom du contrôleur et que {0} est le nom de la vue.

Ajoutez ensuite ce moteur de vue à la collection MVC ViewEngines.Engines dans la méthode Application_Start () de votre global.asax:

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

Merci pour vos réponses. Cela a organisé mon dossier partagé, mais pourquoi créez-vous un nouveau type de moteur de vue? Je viens de créer un nouveau RazorViewEngine , définissez PartialViewLocationFormats et l’ajoute à la liste de ViewEngines .

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

Il est agréable de personnaliser le moteur de visualisation, mais si vous voulez juste avoir un sous-dossier par partiels, vous n’avez pas besoin de beaucoup …

Il vous suffit d’utiliser le chemin d’access complet à la vue partielle, comme pour la vue mise en page:

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

J’espère que ça aide quelqu’un …

J’ai mis à jour l’excellente réponse de lamarant pour inclure des domaines:

 public class RDDBViewEngine : RazorViewEngine { private static readonly ssortingng[] 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() { ssortingng[] areaNames = RouteTable.Routes.OfType() .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area")) .Select(r => r.DataTokens["area"].ToSsortingng()).ToArray(); foreach (ssortingng areaName in areaNames) { AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml"); AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml"); } } } 

Ensuite, n’oubliez pas d’inclure dans votre application le démarrage:

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

Vous pouvez également mettre à jour les formats de vues partielles du fichier RazorViewEngine enregistré. Placez le code ci-dessous dans Application_Start dans Global.asax.

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

Vous pouvez créer votre propre moteur de vue qui dérive du moteur de vue que vous utilisez (Webforms / Razor) et spécifier les emplacements souhaités dans le constructeur ou les append simplement à la liste des emplacements existants:

 this.PartialViewLocationFormats = viewLocations; 

Ensuite, au démarrage de l’application, vous appendiez votre moteur de vue comme ViewEngines.Engines.Add(new MyViewEngineWithPartialPath()); : ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

Si vous faites cela dans ASP.NET Core, allez simplement à la classe Startup, sous la méthode ConfigureServices , et mettez

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