Asp.net mvc ASP.NET MVC:多个视图文件夹和_ViewStart.cshtml文件
我有一个MVC项目,需要有2个不同的视图文件夹。一个位于Asp.net mvc ASP.NET MVC:多个视图文件夹和_ViewStart.cshtml文件,asp.net-mvc,asp.net-mvc-3,razor,viewengine,Asp.net Mvc,Asp.net Mvc 3,Razor,Viewengine,我有一个MVC项目,需要有2个不同的视图文件夹。一个位于~/Views/,另一个位于~/Framework/Views/。这是通过基于razor视图引擎创建自定义视图引擎来实现的,如下所示: public class MyViewEngine : RazorViewEngine { private static string[] AdditionalViewLocations = new[]{ "~/Framework/Views/{1}/{0}.cshtml",
~/Views/
,另一个位于~/Framework/Views/
。这是通过基于razor视图引擎创建自定义视图引擎来实现的,如下所示:
public class MyViewEngine : RazorViewEngine
{
private static string[] AdditionalViewLocations = new[]{
"~/Framework/Views/{1}/{0}.cshtml",
"~/Framework/Views/{1}/{0}.vbhtml",
"~/Framework/Views/Shared/{0}.cshtml",
"~/Framework/Views/Shared/{0}.vbhtml"
};
public MyViewEngine()
{
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AdditionalViewLocations).ToArray();
base.ViewLocationFormats = base.ViewLocationFormats.Union(AdditionalViewLocations).ToArray();
base.MasterLocationFormats = base.MasterLocationFormats.Union(AdditionalViewLocations).ToArray();
}
}
问题是我想在两个视图文件夹中的每个文件夹中使用不同的_ViewStart.cshtml文件(即~/Views/_ViewStart.cshtml
用于~/Views/
文件夹中的视图,~/Framework/Views/_ViewStart.cshtml
用于~/Framework/Views/
文件夹中的视图),但是,视图引擎只使用它在~/Views/
中找到的第一个视图
这可能吗
谢谢选择的
\u ViewStart
是分层的,但是您添加了与~/Views
平行的~/Framework/Views
。我不认为Razor的设置是为了真正做你想做的事情(即两个完全平行的视图位置)。如果您将框架
放入主视图
文件夹中,您的\u ViewStart
将正确加载。这肯定是可能的,我认为您错过了一些东西
我自己使用您提供的视图引擎(逐字复制和粘贴)对此进行了测试。我没有看到和你一样的行为。我有两个\u ViewStart.cshtml
文件,一个位于~/Framework/Views/\u ViewStart.cshtml
,另一个位于~/Views/\u ViewStart.cshtml
在~/Framework/Views/
中运行视图时,它使用Framework文件夹中的\u ViewStart.cshtml
。在~/Views/
中运行视图时,它使用视图文件夹中的\u ViewStart.cshtml
使用DotPeek仔细检查
RazorViewEngine
中的代码也可以确认这正是它的行为方式。视图引擎开始在与正在呈现的视图相同的文件夹中签入名为\u ViewStart.cshtml
的文件,然后沿着目录树一直走到应用程序的根目录。我看到是。框架目录是这样的:~/Views/framework/\u ViewStart.cshtml
和~/Views/framework/Controller/Action.cshtml
。那么,定制的razor视图引擎是否仍然需要,但将附加的ViewLocations更改为类似这样的内容:“~/Views/Framework/{1}/{0}.cshtml”
?还是仍然是并行视图位置?我是否应该将框架文件夹添加为一个区域?(以前没有使用过区域,如果我误解了,很抱歉)不,这正是我要说的。如果将所有“框架”视图放在一个文件夹中,并在该文件夹中放置一个\u ViewStart
,那么它将应用于该级别及以下的所有内容。将其视为一种覆盖。您将不再需要定制剃须刀引擎。至于区域,这也是一种完全可以接受的方法。区域有自己的视图
文件夹,但它们也会查看主视图
文件夹。因此,您可以有一个“框架”区域,并在~/Areas/Framework/Views
文件夹中放置一个\u ViewStart
。为什么不使用区域而不是破坏视图引擎呢?这是绝对可能的-事实上,我只是使用您提供的视图引擎在我的机器上快速创建了它,只是复制和粘贴了一下。我没有看到和你一样的行为。我有两个_ViewStart文件,一个在~/Framework/Views/_ViewStart.cshtml,另一个在~/Views/_ViewStart.cshtml。在~/Framework/Views/中运行视图时,它使用Framework\u ViewStart。在~/Views/中运行视图时,它使用_viewstartthere。使用DotPeek仔细检查RazorViewEngine中的代码也可以确认它应该是这样工作的。你确定你没有遗漏什么吗?@NickAceves:谢谢,你说得对。我的文件保存在错误的位置,错误文件的副本保存在正确的位置!真糟糕!再次感谢。(把它写在答案里,我会记下来)