[英]Adding sub-directory to “View/Shared” folder in ASP.Net MVC and calling the view
我目前正在使用带有Razor的ASP.Net MVC3开发一个站点。 在“查看/共享”文件夹中,我想添加一个名为“Partials”的子文件夹,我可以在其中放置所有部分视图(为了更好地组织网站)。
只要在调用视图时总是引用“Partials”文件夹(使用Razor),我就可以毫无问题地执行此操作:
@Html.Partial("Partials/{ViewName}")
我的问题是,如果有一种方法可以将“Partials”文件夹添加到.Net在搜索视图时经历的列表中,这样我就可以调用我的视图而无需引用“Partials”文件夹,如下所示:
@Html.Partial("{ViewName}")
谢谢您的帮助!
解决了这个问题。 要将我创建的“共享/部分”子目录添加到尝试在Razor中查找部分视图时搜索的位置列表,请执行以下操作:
@Html.Partial("{NameOfView}")
首先创建一个以RazorViewEngine为基类的视图引擎,并按如下方式添加视图位置。 同样,我想将所有部分视图存储在我在MVC创建的默认“Views / Shared”目录中创建的“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}是Controller名称,{0}是视图的名称。
然后将该视图引擎添加到global.asax的Application_Start()方法中的MVC ViewEngines.Engines Collection:
ViewEngines.Engines.Add(new RDDBViewEngine());
谢谢您的回答。 这已经组织了我的共享文件夹,但为什么要创建一种新类型的视图引擎? 我刚刚创建了一个新的RazorViewEngine
,设置它的PartialViewLocationFormats
并将其添加到ViewEngines
列表中。
ViewEngines.Engines.Add(new RazorViewEngine
{
PartialViewLocationFormats = new string[]
{
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
}
});
定制视图引擎很不错,但是如果你只想要一个子文件夹,你就不需要那么多......
只需使用部分视图的完整路径,就像布局视图所做的那样:
@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")
希望它可以帮助某人......
我已经更新了lamarant的优秀答案,包括区域:
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());
}
}
如果您在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");
});
您还可以更新已注册的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();
}
您可以创建注册您自己的视图引擎,该引擎派生自您正在使用的任何视图引擎(Webforms / Razor),并在构造函数中指定您想要的任何位置,或者只是将它们添加到已存在的位置列表中:
this.PartialViewLocationFormats = viewLocations;
然后在应用程序启动时,您将添加您的视图引擎,如下所示: ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.