Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC:多个视图文件夹和_ViewStart.cshtml文件_Asp.net Mvc_Asp.net Mvc 3_Razor_Viewengine - Fatal编程技术网

Asp.net mvc ASP.NET MVC:多个视图文件夹和_ViewStart.cshtml文件

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",

我有一个MVC项目,需要有2个不同的视图文件夹。一个位于
~/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:谢谢,你说得对。我的文件保存在错误的位置,错误文件的副本保存在正确的位置!真糟糕!再次感谢。(把它写在答案里,我会记下来)