Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 3 为什么MVC视图需要存在于视图目录中才能工作?_Asp.net Mvc 3_Razor_Viewbag - Fatal编程技术网

Asp.net mvc 3 为什么MVC视图需要存在于视图目录中才能工作?

Asp.net mvc 3 为什么MVC视图需要存在于视图目录中才能工作?,asp.net-mvc-3,razor,viewbag,Asp.net Mvc 3,Razor,Viewbag,我一直在写一个cms,MVC被用作生成页面的主要引擎 我做得很好,但希望能够创建一个独特的剃须刀模板每个网站,可能每个视图,如果我需要的话 我的规则是,每个项目都必须有一个唯一的代码,该代码与url链接 每个项目现场的资产以位置与项目相关的方式存储 因此,与项目C0001关联的资产将存储在assets\C0001\中,对于C0002:assets\C0002\等 为了保持整洁,我想做的是将razor模板与位于资产\[ProjectCode]位置的项目关联,但问题是我遇到了一个关于视图包在上下文中

我一直在写一个cms,MVC被用作生成页面的主要引擎

我做得很好,但希望能够创建一个独特的剃须刀模板每个网站,可能每个视图,如果我需要的话

我的规则是,每个项目都必须有一个唯一的代码,该代码与url链接

每个项目现场的资产以位置与项目相关的方式存储

因此,与项目C0001关联的资产将存储在
assets\C0001\
中,对于C0002:
assets\C0002\

为了保持整洁,我想做的是将razor模板与位于
资产\[ProjectCode]
位置的项目关联,但问题是我遇到了一个关于
视图包在上下文中不存在的错误

所以这是行不通的:

Layout = string.Concat("~/assets/",ViewBag.ProjectNumber,"/_Layout.cshtml");
其中,以下内容将呈现页面:

Layout = string.Concat("~/Views/Shared/_",ViewBag.ProjectNumber,"Layout.cshtml");
我猜第一个布局不会渲染,因为它在视图的已知搜索区域之外?但是当我告诉它文件在哪里时,我不知道问题出在哪里

我很乐意使用示例2中的代码,但这可能意味着在相当多的项目站点之后,共享视图目录将变得非常繁忙


只是想知道为什么视图需要存在于
视图
目录中?

默认情况下,
RazorViewEngine
配置为查看
视图
目录

您可以通过创建自己的具有不同路径的
RazorViewEngine
实例并将其添加到
ViewEngines.Engines
来更改此设置

它的默认路径是

AreaViewLocationFormats = new[] {
    "~/Areas/{2}/Views/{1}/{0}.cshtml",
    "~/Areas/{2}/Views/{1}/{0}.vbhtml",
    "~/Areas/{2}/Views/Shared/{0}.cshtml",
    "~/Areas/{2}/Views/Shared/{0}.vbhtml"
};
AreaMasterLocationFormats = new[] {
    "~/Areas/{2}/Views/{1}/{0}.cshtml",
    "~/Areas/{2}/Views/{1}/{0}.vbhtml",
    "~/Areas/{2}/Views/Shared/{0}.cshtml",
    "~/Areas/{2}/Views/Shared/{0}.vbhtml"
};
AreaPartialViewLocationFormats = new[] {
    "~/Areas/{2}/Views/{1}/{0}.cshtml",
    "~/Areas/{2}/Views/{1}/{0}.vbhtml",
    "~/Areas/{2}/Views/Shared/{0}.cshtml",
    "~/Areas/{2}/Views/Shared/{0}.vbhtml"
};

ViewLocationFormats = new[] {
    "~/Views/{1}/{0}.cshtml",
    "~/Views/{1}/{0}.vbhtml",
    "~/Views/Shared/{0}.cshtml",
    "~/Views/Shared/{0}.vbhtml"
};
MasterLocationFormats = new[] {
    "~/Views/{1}/{0}.cshtml",
    "~/Views/{1}/{0}.vbhtml",
    "~/Views/Shared/{0}.cshtml",
    "~/Views/Shared/{0}.vbhtml"
};
PartialViewLocationFormats = new[] {
    "~/Views/{1}/{0}.cshtml",
    "~/Views/{1}/{0}.vbhtml",
    "~/Views/Shared/{0}.cshtml",
    "~/Views/Shared/{0}.vbhtml"
};

您需要复制位于
视图
目录中的web.config,并将副本放在
资产
目录中。由于您需要为布局提供完整路径,因此这不是搜索路径问题,它需要web.config中的信息来正确初始化视图。

@marcind:您的权利,感谢您的更正谢谢,这起作用了,它已停止呈现css,但视图显示是朝着正确方向迈出的一步,它不会提供来自这些目录的css文件(我还不知道为什么)。因此,不幸的是,您需要将css放到一个单独的目录树中才能工作;查找并更改httphandler,使谓词显示以下内容:
,这样它将只查找视图文件,而将其余文件留作单独处理。这正是我所需要的。当我在
Global.asax#Application_Start()
中注册了
RazorViewEngine
的自定义实例时,我甚至获得了对自定义视图路径的intellisense支持。非常有用。