Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index...
http://blog.csdn.net/buhuan123/article/details/26387427
目录(?)[-]
- 1那么我们再来看我们需要的访问方式如下图
- razor视图的地址写成通配符就是
- 3那么我们进入正题修改他的寻找视图的规则让他能够按照我们的规则来访问就像修改路由一样
asp.net mvc 为了更好的控制views的页面存放,和控制器的可读性,需要分开多级目录来存放。
1.那么我们再来看我们需要的访问方式,如下图
如果我们要访问Admin下的TestController里面的Index页面,那么我们输入Test/Index,这个肯定不行的。因为TestController根本就不在Controllers的根目录下,而是在Controllers/Admin下,这样我们根本就找不到Test这个Controller。那么我们输入Admin/Test/Index,那么我们就需要添加一个路由配置了,因为以前的默认路由只能通过{Controller}/{Action}/{Id}这种方式访问,就是必须以Controller开头。我们重新配置的路由如下:
public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//路由规则匹配是从上到下的,优先匹配的路由一定要写在最上面。因为路由匹配成功以后,他不会继续匹配下去。routes.MapRoute("Admin", // 路由名称,这个只要保证在路由集合中唯一即可"Admin/{controller}/{action}/{id}", //路由规则,匹配以Admin开头的urlnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // );routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults);}
public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//路由规则匹配是从上到下的,优先匹配的路由一定要写在最上面。因为路由匹配成功以后,他不会继续匹配下去。routes.MapRoute("Admin", // 路由名称,这个只要保证在路由集合中唯一即可"Admin/{controller}/{action}/{id}", //路由规则,匹配以Admin开头的urlnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // );routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults);}
那么我们这个时候再次输入Admin/Test/Index,能找到Views/Admin/Test/Index.cshtml这个页面吗?显然是不能的,因为除了路由配置怎么访问Controller外,寻找Views里面的页面也有自己的规则。测试结果肯定是找不到页面,我们看看错误信息就知道他是怎么寻找cshtml页面了。
razor视图的地址,写成通配符就是:
- Views/{1}/{0}.cshtml
- Views/Shared/{0}.cshtml
{1}表示Controller的名称,{0}表示视图名称,Shared是存放模板页的文件夹。一看就很清楚了。这个就是寻找视图的规则,所以我们存放在Admin/Test/Index.cshtml的存放规则就不满足。那么我们修改下,如下图:
直接将Test文件夹存放在Views下面,那么我们就满足这个寻找视图的规则了,我们输入Admin/Test/Index,也确实访问成功了。
但是这个方式的存储肯定不是我们需要的,既然我们Controller区分存放了,我们肯定也希望Views也能够这样存放的。
3.那么我们进入正题,修改他的寻找视图的规则,让他能够按照我们的规则来访问,就像修改路由一样。
在项目中新建立一个cs类MyViewEngine,继承RazorViewEngine。代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcRoute.MvcEx {public sealed class MyViewEngine : RazorViewEngine{public MyViewEngine(){ViewLocationFormats = new[]{"~/Views/{1}/{0}.cshtml","~/Views/Shared/{0}.cshtml","~/Views/Admin/{1}/{0}.cshtml"//我们的规则};}public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache){return base.FindView(controllerContext, viewName, masterName, useCache);}} }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcRoute.MvcEx {public sealed class MyViewEngine : RazorViewEngine{public MyViewEngine(){ViewLocationFormats = new[]{"~/Views/{1}/{0}.cshtml","~/Views/Shared/{0}.cshtml","~/Views/Admin/{1}/{0}.cshtml"//我们的规则};}public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache){return base.FindView(controllerContext, viewName, masterName, useCache);}} }
然后将这个规则注册到系统中,在global中注册一下,这样我们就可以通过自己的方式来访问了。global注册如下:
protected void Application_Start(){AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);RegisterView();//注册视图访问规则}protected void RegisterView(){ViewEngines.Engines.Clear();ViewEngines.Engines.Add(new MyViewEngine());}
protected void Application_Start(){AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);RegisterView();//注册视图访问规则}protected void RegisterView(){ViewEngines.Engines.Clear();ViewEngines.Engines.Add(new MyViewEngine());}
结果如下图:
转载于:https://www.cnblogs.com/webenh/p/5733599.html
Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index...相关推荐
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
一般我们在mvc开发过程中,都会碰到这样的问题.页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以Controller名命名的文件夹下.如果我们写到别处呢?那么肯 ...
- .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- ASP.NET MVC编程——控制器
每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求. 1操作输入参数 控制器的操作的输入参数可以是内置类型也可以是自定义类型. 2操作返回结果 结果类型 调用方法 备注 ...
- ASP.NET MVC 在控制器中获取某个视图动态的HTML代码
如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中,然后通过代码传入model,动态获取cshtml中的HTML代码 当然 ...
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来 ...
- ASP.NET MVC 4中如何为不同的浏览器自适应布局和视图
在ASP.NET MVC 4中,可以很简单地实现针对不同的浏览器自适应布局和视图.这个得归功于MVC中的"约定甚于配置"的设计理念. 默认的自适应 MVC 4自动地为移动设备浏览器 ...
- 第二章 ASP.NET MVC (控制器向视图传递值(二))
一.可以把整个Models数据存放入ViewData对象或ViewBag对象中从而传递至视图页面. 现在我们来做一个小案例,看看如何将Model数据存储到ViewData对象或ViewBag对象中 现 ...
- 第二章 ASP.NET MVC (控制器向视图传递值(一))
一.可以通过使用ViewData对象和Viewbag对象从控制器传递值到相应名称的试图文件 ,两个的使用语法类似,具体语法请看下面举例 //使用ViewData对象从控制器传递文本数据到试图文件 Vi ...
- yaf 重写index.php,php框架Yaf路由重写
php框架Yaf路由重写 通常为了友好的URL格式,会进行站点URL的重写,可以在webserver(Nginx)的配置中进行rewrite,也可在在程序端进行 以下使用Yaf框架进行URL的重写,进 ...
最新文章
- 10w 行级别数据的 Excel 导入优化记录
- python库pickle的用法
- android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值
- python天天学怎么样-python练习:好好学习,天天向上
- 错误处理:RuntimeError: [enforce fail at ..\caffe2\serialize\inline_container.cc:145] . PytorchStreamRead
- Git 存储过程探究_无赖皮肤-ChinaUnix博客
- 全球最顶级的电脑配置_全球最顶级外汇交易员,非这10位莫属
- 是的,又一次立FLAG了
- mysql词法分析antlr4_词法分析器和语法分析器的界线 - ANTLR 4 简明教程
- 【NOIP 模拟赛】Evensgn 剪树枝 树形dp
- Windows2003操作系统SQL Server 2008安装图解(详细)
- 计算机体系结构和计算机组成哪个重要,计算机组成和体系结构教学初探.doc
- 动态lacp和静态lacp区别_LACP学习笔记
- Linux抓包命令集锦(tcpdump抓包)
- 基于主成分分析的贵州省综合经济实力
- AI简史 | 星际英雄传说
- Python模块——标准库\开源模块\自定义模块
- 数据挖掘 顶级期刊_数据挖掘顶级期刊简介_47209.doc
- 赵雅智_名片夹(4)_Android中listview可折叠伸缩仿手风琴效果(静态)
- ZYNQ有两个CPU?(二)——OCM共享内存
热门文章
- php变量除去_,php方法综述除去换行符(PHP_EOL使用变量)
- 单片机节日彩灯实训报告_单片机课程设计(节日彩灯控制)
- MT8870DTMF解码器测试
- Paddle 网络中的Tensor 数据结构
- 基于NanoVNA调整150kHz``选频``放大电路
- 航天智慧物流线上预选赛-成绩公布
- 使用TESSERACT来识别字符
- sublime_text配置php调试环境,SublimeText2配置PHP调试环境(在windows环境下)
- rust python扩展_Rust语言优化Python性能案例
- linux串口拼接,Linux下串口操作之數據拼接