A-A+

Asp.Net MVC4.0开发CMS系统案例之路由规则修改

2015年12月29日 电脑网络 暂无评论 阅读 3 views 次

今天开放的时候,发现如果我要把生成View视图页csthtml建立多个文件夹目录下面,contraller就找不到了。实际开发工作中,不可能所有生成的视图都放在View下面的一级文件夹下,对于系统的代码管理不是十分科学,于是我就尝试如何让它实现。

比如登录功能,控制器建立的路径为:Contrallers/Sys/Com/UserContraller.cs.如图:

系统添加视图默认生成View的路径为:View/User/UserLogin.cshtml.如果我要把路径改为View/Sys/Com/UserLogin.cshtml,与Contraller的保持一直,就会报错系统找不到它。

系统默认的规则只会到view/user/里面搜索。这是因为路由设置了/view/{contraller}/{action}/id 规则,当文件被移走之后就找不到了。因此我们需要通知真正的位置在哪里。

自定义路由规则,在App_Start文件夹下新建一个类MyRoute.继承自RazorViewEngine 对选择视图方法FindView进行重写。编写代码如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6.    
  7. namespace Hillstone.App_Start  
  8. {  
  9.    
  10.     public sealed class MyRoute : RazorViewEngine  
  11.     {  
  12.         /// <summary>  
  13.         /// 自定义路由规则  
  14.         /// </summary>  
  15.         public MyRoute()  
  16.         {  
  17.             ViewLocationFormats = new[]  
  18.             {  
  19.                 "~/Views/{1}/{0}.cshtml",  
  20.                 "~/Views/Shared/{0}.cshtml",  
  21.                 "~/Views/Sys/Com/{1}/{0}.cshtml"  
  22.             };  
  23.         }  
  24.         public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)  
  25.         {  
  26.             return base.FindView(controllerContext, viewName, masterName, useCache);  
  27.         }  
  28.    
  29.     }  
  30. }  

让将这个路由规则在Global中注册,注册方法如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Http;  
  6. using System.Web.Mvc;  
  7. using System.Web.Optimization;  
  8. using System.Web.Routing;  
  9. using Hillstone.DAL;  
  10. using Hillstone.App_Start;  
  11.    
  12. namespace Hillstone  
  13. {  
  14.     // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,  
  15.     // 请访问 http://go.microsoft.com/?LinkId=9394801  
  16.    
  17.     public class MvcApplication : System.Web.HttpApplication  
  18.     {  
  19.         protected void Application_Start()  
  20.         {  
  21.             AreaRegistration.RegisterAllAreas();  
  22.    
  23.             WebApiConfig.Register(GlobalConfiguration.Configuration);  
  24.             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
  25.             RouteConfig.RegisterRoutes(RouteTable.Routes);  
  26.             BundleConfig.RegisterBundles(BundleTable.Bundles);  
  27.    
  28.             RegisterView();//注册视图访问规则  
  29.            // System.Data.Entity.Database.SetInitializer<HillstoneContext>(new Initializer());  
  30.         }  
  31.         protected void RegisterView()  
  32.         {  
  33.             ViewEngines.Engines.Clear();  
  34.             ViewEngines.Engines.Add(new MyRoute());  
  35.         }  
  36.     }  
  37. }  

运行OK.

标签:

给我留言