Asp.net mvc 3 为什么MVC视图需要存在于视图目录中才能工作?
我一直在写一个cms,MVC被用作生成页面的主要引擎 我做得很好,但希望能够创建一个独特的剃须刀模板每个网站,可能每个视图,如果我需要的话 我的规则是,每个项目都必须有一个唯一的代码,该代码与url链接 每个项目现场的资产以位置与项目相关的方式存储 因此,与项目C0001关联的资产将存储在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]位置的项目关联,但问题是我遇到了一个关于视图包在上下文中
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支持。非常有用。