文章出處

一、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 中被清除。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()