搭建EF6.0+MVC4搭建框架——之路由配置
为了适应项目需求,需要将前后台的控制器和视图等文件分开,便于修改和维护:
方案一:在原有的Controller下新增Admins文件夹用于放置后台控制器文件:
控制器文件目录如下图:
视图文件目录:
修改项目App_Start文件夹下的RouteConfig.cs文件的RegisterRoutes方法:
新增
routes.MapRoute( name: "Admins", // 路由名称,这个只要保证在路由集合中唯一即可 url: "Admins/{controller}/{action}/{id}",//路由规则,匹配以Admin开头的url defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional } // new string[] { "ClassificationLabDecisionWebApp.Controllers.PreClassification" } );
修改后的RegisterRoutes方法:
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 6 routes.MapRoute( 7 name: "Admins", // 路由名称,这个只要保证在路由集合中唯一即可 8 url: "Admins/{controller}/{action}/{id}",//路由规则,匹配以Admin开头的url 9 defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional }// 默认Admin控制器 10 // new string[] { "ClassificationLabDecisionWebApp.Controllers.PreClassification" } 11 ); 12 13 routes.MapRoute( 14 name: "Default", 15 url: "{controller}/{action}/{id}", 16 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 17 ); 18 19 20 }
此时运行程序,当前台页面跳转后台页面时会报找不到视图的错误,这是由于所建立的视图在没有在视图引擎上注册:
在项目App_Start文件夹下新增类文件MyViewEngine.cs 代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace XYBK_Application.App_Start 8 { 9 public sealed class MyViewEngine : RazorViewEngine 10 { 11 12 public MyViewEngine() 13 { 14 ViewLocationFormats = new[] 15 { 16 "~/Views/{1}/{0}.cshtml", 17 "~/Views/Shared/{0}.cshtml", 18 "~/Views/Admins/{1}/{0}.cshtml",//自定义视图路径引擎 19 }; 20 base.PartialViewLocationFormats = base.ViewLocationFormats; 21 } 22 public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 23 { 24 return base.FindView(controllerContext, viewName, masterName, useCache); 25 } 26 27 } 28 }
修改Global.asax文件:
新增注册方法:
protected void RegisterView() { ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new MyViewEngine()); }
并将方法RegisterView()放到Application_Start()方法中调用:
1 protected void Application_Start() 2 { 3 AreaRegistration.RegisterAllAreas(); 4 5 WebApiConfig.Register(GlobalConfiguration.Configuration); 6 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 7 RouteConfig.RegisterRoutes(RouteTable.Routes); 8 RegisterView();//注册视图引擎 9 BundleConfig.RegisterBundles(BundleTable.Bundles); 10 }
方案二:创建Areas文件夹,在Areas文件夹下分别创建Admin,Home,Web文件夹分别用于放置后台,前台,页面的控制器和视图等文件(具体文件夹数量和命名根据时局需要修改)。
然后分别在三个文件夹下创建Controllers控制器文件夹用于放置控制器文件,Views文件夹用于放置视图文件,ViewModel文件夹用于放置视图实体类(根据需求添加)。
Areas下的三个文件夹下必须分别添加一个类文件用于注册路由。
例如:Admins文件夹下添加类文件AdminAreaRegistration.cs,文件内容:
1 using System.Web.Mvc; 2 3 namespace XYBK_Application.Areas.Admins 4 { 5 public class AdminAreaRegistration : AreaRegistration 6 { 7 public override string AreaName 8 { 9 get 10 { 11 return "Admins"; 12 } 13 } 14 15 public override void RegisterArea(AreaRegistrationContext context) 16 { 17 context.MapRoute( 18 "Admins_default",//路由名称 19 "Admins/{controller}/{action}/{id}",//路由规则,匹配以Admin开头的url 20 new { controller = "Admin", action = "Index", id = UrlParameter.Optional }, 21 new string[] { "XYBK_Application.Areas.Admins.Controllers" }//文件夹下控制器对应的命名空间,根据不同文件夹修改 22 ); 23 } 24 } 25 }
修改项目App_Start文件夹下的RouteConfig.cs文件的RegisterRoutes方法:
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 name: "Default", // 路由名称,这个只要保证在路由集合中唯一即可 7 url: "{controller}/{action}/{id}",//路由规则,匹配url 8 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 9 namespaces: new string[] { "XYBK_Application.Controllers" }//项目Controllers文件夹中的控制器命名空间 10 ); 11 12 }
图示:
页面跳转时可以在控制器中用 return Redirect(URL);实现页面重定向:
例如:
public ActionResult Index() { return Redirect("/Home/Index/Index");//跳转到Home下的Index控制器下的Index视图 //return View(); }