ASP.NET MVC3 Routing

 

Global.asax 與 HttpModule事件

Application_Start
Init
BeginRequest
AuthenticateRequest
PostAuthenticateRequest
AuthorizeRequest
PostAuthorizeRequest
UrlRoutingModule (Routing module)
ResolveRequestCache
PostResolveRequestCache
PostMapRequestHandler
AcquireRequestState
PostAcquireRequestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
PostReleaseRequestState
UpdateRequestCache
PostUpdateRequestCache
LogRequest
PostLogRequest
EndRequest

如同上面的執行順序,Routing 的規則是在 UrlroutingModule 的時候根據 RouteTable 這個靜態物件來決定的,基本上在事件之前把 RouteTable 準備好就可以了,不過在 HttpModule 的事件中是每次執行都會被呼叫一輪。

RouteCollectionExtensions

在這邊提供兩種方法,在範例中是微軟推薦的 Route 設計方法就是 IgnoreRoute 跟MapRoute。

public static void IgnoreRoute(
this RouteCollection routes,
string url,
object constraints
);
public static Route MapRoute(
this RouteCollection routes,
string name,
string url,
object defaults,
object constraints,
string[] namespaces
);

url: 收到 request 的 url

"{controller}/{action}/{mode}/{id}"

在這邊 controler 的參數就是 controler 的名稱,action 也就是 action 的名稱 , 另外還有 mode 跟 id 。

default: 針對 url 的預設值

new { controller = "Home", 
action = "Index",
mode = UrlParameter.Optional,
id = UrlParameter.Optional }

UrlParameter.Optional 也就是非必填。

constraints: 一些限制條件,也是根據 url 來設定,這邊可以支援 Regex 的寫法。

new 
{
mode = @"(page|panel|s*)",
id = @"(d|s*)"
}

如果這邊限制條件跟預設值相牴觸的時候,預設值是不會通過的,在這邊限制 mode 只有三種是 “page” , “panel” , 還有空字串,id 則必須是數字或是空字串。

條件設定完之後儲存在 RouteTable 這個靜態物件之中,所以這邊的判斷需要是符合預設的規則,沒有辦法根據建立時的某個條件來判斷,只能依照每次 request 系統帶入的資料來做處理。

 

IRouteConstraint

如果需要自訂 Route 條件,可以藉由實作這個介面來實現。內部只有一個 Match 方法,也就是每次 request 進來的時候判斷 routing 呼叫的方法。

 

using System.Web;
using System.Web.Routing;

namespace Simon.UI.Mvc
{
public class DeviceConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext,
Route route, string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
return httpContext.Request.Browser.Browser
== "Chrome" ? true : false;
}
}
}

加上剛剛設定的條件

mode = @"(page|panel|s*)",
id = @"(d|s*)",
IsChrome = new DeviceConstraint()

就加上限制只有 browser 是 Chrome 才符合這個 routing 的條件。

Reference

HttpApplication 類別

http://msdn.microsoft.com/zh-tw/library/system.web.httpapplication.aspx

ASP.NET MVC 開發心得分享 (21):Routing 觀念與技巧

http://blog.miniasp.com/post/2011/08/01/ASPNET-MVC-Developer-Note-Part-21-Routing-Concepts-and-Skills.aspx

Invoking methods @ Runtime on method name

http://www.codeproject.com/KB/cs/runtime_method_invoke.aspx

Mix: Mobile Web Sites with ASP.NET MVC and the Mobile Browser Definition File

How Would I Change ASP.NET MVC Views Based on Device Type?

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *