修改MVC视图默认搜索规则(IViewEngine)
前几天我自己在写一个系统,写到后台管理系统的时候,我突然有个想法就是:想在区域视图下新建文件,单独处理后台一些业务:Area/AdminManager/View/Content/Index.cshtml;这么一个路径,我刚建完就发现有点不对了,因为根据mvc默认的规则就是ControllerName/ViewName,所以我不管怎么新建文件夹,视图 都是在ManagerController控制下,换言之,到达浏览器的地址是这样的:Area/Manager/Index 而不是我们心中的:Area/AdminManager/Content/Index
好,有人想到了一种解决方案了:那就是修改路由;
的确,我也想到了这种方法。预示我就在区域视图下修改路由:
context.MapRoute(
"Managercontent",
"manager/{controller}/{action}/{id}",
new{action = "default",id=UrlParameter.Optional}
);
然后在controllers文件夹中新建一个专门处理后台某块业务的控制器——ContentController
然后运行,结果还是曝黄页,显示的内容是404,没有找到指定路径下的视图文件,我看了黄页的内容,是这样的
未找到“XXX”视图,...搜索了以下位置:
~/Area/AdminManage/Views/Content/Welcome.cshtml
~/Area/AdminManage/Views/Content/Welcome.vbhtml
~/Area/AdminManage/Views/Shared/Welcome.cshtml
~/Area/AdminManage/Views/Shared/Welcome.vbhtml
~/Views/Content/Welcome.cshtml
~/Views/Content/Welcome.vbhtml
~/Views/Shared/Welcome.cshtml
~/Views/Shared/Welcome.vbhtml
看到这个信息之后,我心中的想法就是:怎么mvc找的是这些指定的路径?怎么不去找我新建的~/Area/AdminManage/Views/Manage/Content/Welcome.cshtml
我研究了下规律,因为是区域,所以搜索视图前面的Area/AdminManage/Views/是固定的,后面的Content/Welcome.cshtml中的Content是控制器名称,welcome是action名称
那么也就是说mvc框架默认的查找视图的路径就是这样的,只在Views根目录下找,而不去找它的子目录,那么如何修改这个规则呢?mvc不是“约定优于配置”的嘛
肯定是跟试图引擎IViewEngine有关,我带着疑问去网上找资料,果然解决方案还是很多的,下面我参照网上的做法:
/// <summary>
/// 修改视图引擎搜索视图文件规则
/// </summary>
public sealed class MultipleEngineHelper : RazorViewEngine
{
public MultipleEngineHelper() {
ViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
"~/Areas/AdminManage/Views/Manage/{1}/{0}.cshtml",
};
} public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
return base.FindView(controllerContext, viewName, masterName, useCache);
}
}
光有这个还没用,还需要在Gloab添加注册
proteced void Application_Start(){
....
RegisterView();
} private void RegisterView()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new MultipleEngineHelper());
}
这样我们重新正常运行啦!
修改MVC视图默认搜索规则(IViewEngine)的更多相关文章
- 修改 mvc webapi 默认返回 json 格式
web api 默认的已 xml 格式返回数据 现在开发一般都是以 json 格式为主 下面配置让 webapi 默认返回 json ,在需要返回 xml 时只需要加一个查询参数 datatype=x ...
- 修改MVC默认的pageBaseType以添加功能
试想下在MVC的前端页面JS或者html中需要使用多语言,而后端的多语言是维护在资源文件中的,前端如果使用的话需要使用AJAX频繁的获取,一个页面中可能会存在大量的需要语言转换的地方,频繁使用AJAX ...
- ASP.NET MVC 视图(三)
ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...
- ASP.NET MVC 视图(一)
ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...
- ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- ASP.NET MVC 视图(五)
ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...
- ASP.NET MVC 视图(四)
ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...
- MVC视图展现模式之移动布局解析-续集
网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html demo:http://pan.baidu.com ...
随机推荐
- MaxScript调用DotNet时命名空间的问题
Fn GetSpecialFolder argEnumName = (DotNetClass "System.Environment").GetFolderPath (Execut ...
- Storm的Metric接口简介
本文由作者林洋港授权网易云社区发布. 作为服务端程序,我们总是需要向外界报告一些统计数据,以助于了解系统的运行情况,比如某个接口的调用时间.系统处理的请求数等等.当我们的程序以Storm Topolo ...
- 【大数据之数据仓库】kudu性能测试报告分析
本文由 网易云发布. 这篇博文主要的内容不是分析说明kudu的性能指标情况,而是分析为什么kudu的scan性能会这么龊!当初对外宣传可是加了各种 逆天黑科技的呀:列独立存储.bloom filte ...
- jenkins 配置。
为了避免在jenkins操作过程中的权限问题. 将安装在/Users/Shared/jenkins目录下的卸载. sudo launchctl unload /Library/LaunchDaemon ...
- 关于ManyToMany的一点补充
1.先看model的定义 user表: class User(models.Model): """ 用户表 """ username = m ...
- win32 音视频相关 api
waveInGetNumDevs waveInGetDevCaps waveInOpen waveInGetDevCaps waveInPrepareHeader waveInAddBuffer wa ...
- xss跨站脚本攻击汇总
- python 实现视频的下载以及断点续传
---恢复内容开始--- 一般情况下我们使用爬虫更多的应该是爬数据或者图片吧,今天在这里和大家分享一下关于使用爬虫技术来进行视频下载的方法,不仅可以方便的下载一些体积小的视频,针对大容量的视频下载同样 ...
- 使用BeanUitls提高对象拷贝效率
首先来创建两个bean 注:一定要有set/get方法,成员变量必须要同名 public class User1 { String name; String password; String phon ...
- 【xsy1131】tortue FFT
题目大意: 一次游戏要按N个按键.每个按键阿米巴有P[i]的概率按错.对于一串x个连续按对的按键,阿米巴可以得分 $f(x)=tan(\dfrac{x}{N})\times e^{arcsin(0.8 ...