1. 程式人生 > >ASP.NET MVC中的路由IRouteConstraint方法應用實例

ASP.NET MVC中的路由IRouteConstraint方法應用實例

http col spa Go clas .aspx direct lec rep

在如下代碼的寫法中:

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
       routes.MapPageRoute("Report", "report", "~/Content/page/report.aspx")
       routes.MapRoute( name: "BaseManage", url: 
"Admin/BaseManage/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
       routes.MapRoute( name:
"Order", url: "Admin/OrderManage/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
       routes.MapRoute( name:
"Admin", url: "Admin/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
       routes.MapRoute( name:
"Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
     }
  }

因為系統需要,方法RegisterRoutes中同時應用了MapPageRoute和MapRoute方法,這樣寫的後果就是所有的頁面加載時都跳轉到了WEBFORM頁面中,導致系統報錯。

報錯原因是兩種不同的方式之間有沖突,解決這個問題,需要給MapPageRoute加個約束,這時就用到了IRouteConstraint接口,看如下代碼:

public class MyCustomConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            return routeDirection == RouteDirection.IncomingRequest;
        }
    }

然後按如下修改語句即可

//routes.MapPageRoute("Report", "report", "~/Content/page/report.aspx");
routes.MapPageRoute("Report", "report", "~/Content/page/report.aspx", true, null, new RouteValueDictionary { { "outgoing", new MyCustomConstraint() } });

ASP.NET MVC中的路由IRouteConstraint方法應用實例