Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
2017-06-28 16:41
656 查看
目录(?)[-]1正常的项目目录如下图
2那么我们再来看我们需要的访问方式如下图
The following locations were searched 翻译过来就是以下地址被搜索过那么他只搜索这些地址这里我只写razor视图的地址写成通配符就是
3那么我们进入正题修改他的寻找视图的规则让他能够按照我们的规则来访问就像修改路由一样
当asp.net mvc框架接收到一个url请求时会根据url的值结合我们在Global中的配置的路由规则找到一个具体的Controller,然后通过在Action中返回一个类型为ActionResult的对象,这个会将把操作交给MVC框架的视图引擎找到相应的视图。下面我通过一个具体的url来说明:http://www.MySite.com/Home/IndexGlobal中是这样设置的路由:routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
1、~/Views/Home/Index.cshtml
2、~/Views/Home/Index.vbhtml
3、~/Views/Shared/Index.cshtml
4、~/Views/Shared/Index.vbhtml
5、~/{area-name}/Views/Home/Index.cshtml
6、~/{area-name}/Views/Home/Index.vbhtml
7~/{area-name}/Views/Shared/Index.cshtml
8、~/{area-name}/Views/Shared/Index.vbhtml
也就是asp.net mvc默认视图引擎会是根据Action的名称到项目的文件夹中去找,顺序是按1-8依次查找,只要查找到匹配的视图就停止继续往下查找。如果要避免这样查找View步骤,可以在Action的最后返回视图的时候指定视图文件的完整路径。如:return View("~/Views/Home/Index.cshtml")
最后,虽然asp.net mvc默认查找view的顺序规则是通过名称来找的,但是也可以自己扩展自己写一个视图引擎来按照自己的要求来找视图。一般我们在mvc开发过程中,都会碰到这样的问题。页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以 Controller名命名的文件夹下。如果我们写到别处呢?那么肯定会报错。这是mvc中一个约定俗成的一个规定,必须这样写。
我们要访问Index页面,只需要输入Home/Index就可以访问了。我们之所以能够这样访问,是因为我们在项目创建之初系统就默认配置了一个默认的路由。我们可以按照这个默认的路由规则进行访问
如果我们要访问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开头的url
new { controller = "Home", action = "Index", id = UrlParameter.Optional } //
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
那么我们这个时候再次输入Admin/Test/Index,能找到Views/Admin/Test/Index.cshtml这个页面吗?显然是不能的,因为除了路由配置怎么访问Controller外,寻找Views里面的页面也有自己的规则。测试结果肯定是找不到页面,我们看看错误信息就知道他是怎么寻找cshtml页面了。
Views/Shared/{0}.cshtml
{1}表示Controller的名称,{0}表示视图名称,Shared是存放模板页的文件夹。一看就很清楚了。这个就是寻找视图的规则,所以我们存放在Admin/Test/Index.cshtml的存放规则就不满足。那么我们修改下,如下图
直接将Test文件夹存放在Views下面,那么我们就满足这个寻找视图的规则了,我们输入Admin/Test/Index,也确实访问成功了
但是这个方式的存储肯定不是我们需要的,既然我们Controller区分存放了,我们肯定也希望Views也能够这样存放的。
然后将这个规则注册到系统中,在global中注册一下,这样我们就可以通过自己的方式来访问了。global注册如下:
结果如下图:
2那么我们再来看我们需要的访问方式如下图
The following locations were searched 翻译过来就是以下地址被搜索过那么他只搜索这些地址这里我只写razor视图的地址写成通配符就是
3那么我们进入正题修改他的寻找视图的规则让他能够按照我们的规则来访问就像修改路由一样
当asp.net mvc框架接收到一个url请求时会根据url的值结合我们在Global中的配置的路由规则找到一个具体的Controller,然后通过在Action中返回一个类型为ActionResult的对象,这个会将把操作交给MVC框架的视图引擎找到相应的视图。下面我通过一个具体的url来说明:http://www.MySite.com/Home/IndexGlobal中是这样设置的路由:routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
1、~/Views/Home/Index.cshtml
2、~/Views/Home/Index.vbhtml
3、~/Views/Shared/Index.cshtml
4、~/Views/Shared/Index.vbhtml
5、~/{area-name}/Views/Home/Index.cshtml
6、~/{area-name}/Views/Home/Index.vbhtml
7~/{area-name}/Views/Shared/Index.cshtml
8、~/{area-name}/Views/Shared/Index.vbhtml
也就是asp.net mvc默认视图引擎会是根据Action的名称到项目的文件夹中去找,顺序是按1-8依次查找,只要查找到匹配的视图就停止继续往下查找。如果要避免这样查找View步骤,可以在Action的最后返回视图的时候指定视图文件的完整路径。如:return View("~/Views/Home/Index.cshtml")
最后,虽然asp.net mvc默认查找view的顺序规则是通过名称来找的,但是也可以自己扩展自己写一个视图引擎来按照自己的要求来找视图。一般我们在mvc开发过程中,都会碰到这样的问题。页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以 Controller名命名的文件夹下。如果我们写到别处呢?那么肯定会报错。这是mvc中一个约定俗成的一个规定,必须这样写。
1.正常的项目目录,如下图:
我们要访问Index页面,只需要输入Home/Index就可以访问了。我们之所以能够这样访问,是因为我们在项目创建之初系统就默认配置了一个默认的路由。我们可以按照这个默认的路由规则进行访问
2.那么我们再来看我们需要的访问方式,如下图
如果我们要访问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开头的url
new { controller = "Home", action = "Index", id = UrlParameter.Optional } //
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
那么我们这个时候再次输入Admin/Test/Index,能找到Views/Admin/Test/Index.cshtml这个页面吗?显然是不能的,因为除了路由配置怎么访问Controller外,寻找Views里面的页面也有自己的规则。测试结果肯定是找不到页面,我们看看错误信息就知道他是怎么寻找cshtml页面了。
“The following locations were searched” 翻译过来就是"以下地址被搜索过"。那么他只搜索这些地址,这里我只写razor视图的地址,写成通配符就是
Views/{1}/{0}.cshtmlViews/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); } } }
然后将这个规则注册到系统中,在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()); }
结果如下图:
相关文章推荐
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
- Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
- MVC 多级目录(控制器) 路由重写 及 多级Views目录 的寻找视图的规则
- Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则
- Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则
- Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index
- asp.net mvc View视图目录修改
- 关于TP5视图分离到根目录的解决方法 原有: 为了方便前端开发,我想把视图(view)部分分离出来专门给前端进行修改 过程:在进行视图设置分离的过程遇到了问题 参考了官方文档http://www
- 也玩MVC3.0 Razor自定义视图引擎“.NET技术”来修改默认的Views目录结构
- 修改iptables防火墙规则解决vsftp登录后不显示文件目录的问题
- 重写view的onAttachedToWindow () 和 onDetachedFromWindow ()与Home键屏蔽,捕获,修改
- 【view】修改现有的视图
- ASP.NET MVC4 ASP.NET Web API路由规则
- 也玩MVC3.“.NET研究”0 Razor自定义视图引擎来修改默认的Views目录结构