一、URL Routing
1.添加URL路由映射的一般方法(在RegisterRoutes方法中添加):
//第一種(建議采用這種): routes.MapRoute( "MyRoute", // 路由名稱 "{controller}/{action}/{id}",// 帶有參數的 URL new { controller = "Default", action = "Index", id = UrlParameter.Optional }, // 參數默認值 new { controller=@"\w+",action=@"^Get|Update|Delete\w+$",id=@"\d+" } //路由約束 ); //第二種: Route myRoute = new Route("{controller}/{action}/{id}", // 帶有參數的 URL new RouteValueDictionary(new { controller = "Default", action = "Index", id = UrlParameter.Optional }), // 參數默認值 new RouteValueDictionary(new { controller = @"\w+", action = @"^Get|Update|Delete\w+$", id = @"\d+" }), //路由約束 new MvcRouteHandler()); routes.Add("MyRoute", myRoute);
2.自定義路由約束:通過實現 IRouteConstraint 接口來定義自己的路由約束規則
/// <summary> /// 訪問時間約束(當大于指定的時間才允許訪問) /// </summary> public class AccessTimeConstraint : IRouteConstraint { DateTime? allowAccessTime = null; public AccessTimeConstraint(DateTime allowAccessTime) { this.allowAccessTime = allowAccessTime; } public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { return allowAccessTime == null ? true : ((DateTime)allowAccessTime).CompareTo(DateTime.Now) <= 0; } } routes.MapRoute("default", "test/{action}/{id}", new { controller = "Default", action = "Index", id = UrlParameter.Optional }, new{accessTimeConstraint=new AccessTimeConstraint(DateTime.Parse("2015-08-28 10:00:00"))});
3.Area注冊的路由與Global注冊的路由發生沖突解決方案:為Global注冊的路由指定命名空間,路由系統在對路由進行匹配時,優先匹配指定了命名空間的controller,如果匹配到則即刻停止查找,如果在指定的命名空間下沒有匹配到對應的controller,再按照一般的方式進行匹配。
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "MvcApplication1.Controllers" } ); }
4.在 Controller 中從上下文對象中可以獲取如下的狀態數據:
5.Controller的基本工作順序(有視圖的情況):
-->IController.Execute-->Controller.CreateActionInvoker
-->IActionInvoker.InvokeAction-->ActionResult.ExecuteResult
-->ViewResultBase.FindView-->IVew.Render-->IViewEngine.ReleaseView
6.若要自定義Controller,只要實現IController接口并重寫Execute方法即可,若要自定義ActionResult,只要繼承ActionResult抽象類并重寫ExecuteResult方法即可,若要自定義視圖引擎,則需要繼承ViewResultBase抽象類并重寫FindView方法、實現IVew接口并重寫Render方法,以及實現IViewEngine接口并重寫ReleaseView方法
7.從 Action 傳遞數據到 View 的方式:
ViewBag:是動態(dynamic)的弱類型,在程序運行的時候解析,是 MVC3 中新增的特性,只在當前View有效。
ViewData:是字典集合,只在當前View有效,性能比 ViewBag 高,但是使用的時候需要類型轉換。
TempData:是字典集合,一般用于兩個請求之間臨時緩存內容或頁面間傳遞消息,保存在 Session 中,使用完以后則從 Session 中被清除。
文章列表