将子目录添加到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"); });