前几天我自己在写一个系统,写到后台管理系统的时候,我突然有个想法就是:想在区域视图下新建文件,单独处理后台一些业务: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)的更多相关文章

  1. 修改 mvc webapi 默认返回 json 格式

    web api 默认的已 xml 格式返回数据 现在开发一般都是以 json 格式为主 下面配置让 webapi 默认返回 json ,在需要返回 xml 时只需要加一个查询参数 datatype=x ...

  2. 修改MVC默认的pageBaseType以添加功能

    试想下在MVC的前端页面JS或者html中需要使用多语言,而后端的多语言是维护在资源文件中的,前端如果使用的话需要使用AJAX频繁的获取,一个页面中可能会存在大量的需要语言转换的地方,频繁使用AJAX ...

  3. ASP.NET MVC 视图(三)

    ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...

  4. ASP.NET MVC 视图(一)

    ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...

  5. ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  6. ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...

  7. ASP.NET MVC 视图(五)

    ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...

  8. ASP.NET MVC 视图(四)

    ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...

  9. MVC视图展现模式之移动布局解析-续集

    网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html demo:http://pan.baidu.com ...

随机推荐

  1. bower报错:未能连接到github.com端口1080:超时和一些其他错误

    报错1:fatal: unable to access 'https://github.com/xxx/xxxx.git/': Failed to connect to github.com port ...

  2. 知物由学 | AI时代,那些黑客正在如何打磨他们的“利器”?(一)

    本文由  网易云发布. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学” ...

  3. Linux openvswitch 性能调优-flow-eviction-threshold

    原文:https://www.cnblogs.com/scottieyuyang/p/5683656.html Increasing the flow-eviction threshold The t ...

  4. CRUD组件的高阶使用

    1.list页面自定列显示: class PermissionConfig(sites.AryaConfig):       def dabo(self, obj=None, is_header=Fa ...

  5. Netty核心概念(6)之Handler

    1.前言 本节介绍Netty中第三个重要的概念——Handler,这个在前两节都提到了,尤其是Channel和Handler联系紧密.handler本身的设计非常简单,但是所起到的作用却很大,Nett ...

  6. php如何使用rabbitmq实现发布消息和消费消息(tp框架)(第一篇)

    1,默认已经安装好了rabbitmq: 参考 http://www.cnblogs.com/spicy/p/7017603.html 2,安装rabbitmq客户端: 方法1: pecl 扩展安装  ...

  7. 【数组】3Sum

    题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find al ...

  8. hexo上部署博客到Github失败

    fatal: could not read Username for 'https://github.com': No error 今天在上传博客到搭建到 Github 的个人博客上的时候,已经使用 ...

  9. docker “no space left on device”问题定位解决

    在paas环境上使用docker加载镜像的时候出现了如下问题 第一反应应该是存储镜像的路径磁盘满了 docker info查看docker的根路径,可以看到为/opt/docker: 查看/opt/d ...

  10. Linux-(which,whereis,locate,find)

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which  查看可执行文件的位置. whereis 查看文件的位置. locate   配合数据库查看文件位置 ...