将子目录添加到ASP.Net MVC中的“查看/共享”文件夹并调用该视图

我目前正在使用Razor开发一个使用ASP.Net MVC3的网站。 在“查看/共享”文件夹中,我想添加一个名为“Partials”的子文件夹,我可以放置所有的部分视图(为了更好地组织网站。

只要我在调用视图(使用Razor)时总是引用“Partials”文件夹,我就可以做到这一点没有问题:

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

我的问题是,如果有一种方法可以将“Partials”文件夹添加到.Net在search视图时通过的列表中,这样我就可以调用我的视图,而无需引用“Partials”文件夹,如下所示:

 @Html.Partial("{ViewName}") 

谢谢您的帮助!

解决了这个问题。 要在“Razor”中find“局部视图”时使用以下命令将我创build的“Shared / Partials”子目录添加到search到的位置列表中:

 @Html.Partial("{NameOfView}") 

首先创build一个RazorViewEngine作为其基类的视图引擎,并添加您的视图位置,如下所示。 同样,我想将所有的部分视图存储在由MVC创build的默认“Views / Shared”目录下创build的“Partials”子目录中。

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

请注意,位置格式中的{1}是控制器名称,{0}是视图的名称。

然后将该视图引擎添加到您的global.asax的Application_Start()方法中的MVC ViewEngines.Engines集合中:

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

谢谢您的回答。 这已经组织了我的共享文件夹,但为什么你创build一个新的视图引擎types? 我刚做了一个新的RazorViewEngine ,将其设置为PartialViewLocationFormats并将其添加到ViewEngines列表中。

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

定制视图引擎是很好的,但如果你只是想有一个子文件夹部分你不需要那么多…

只需使用部分视图的完整path,就如同布局视图一样:

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

希望它可以帮助别人…

我已经更新了阿拉伯人的优秀答案,包括领域:

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

那么不要忘记在你的应用程序中包含开始:

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

您也可以更新注册的RazorViewEngine的partialview-location-formats。 将下面的代码放在Global.asax的Application_Start中。

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

你可以创build注册自己的视图引擎,这个引擎可以从你正在使用的任何视图引擎(Webforms / Razor)中派生出来,并且在构造器中指定你想要的任何位置,或者将它们添加到已经存在的位置列表中:

 this.PartialViewLocationFormats = viewLocations; 

然后在应用程序开始,你会像这样添加你的视图引擎: ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

如果你正在ASP.NET Core中这样做,那么简单的进入Startup类,在ConfigureServices方法下,然后放置

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