2013-06-26 65 views
1

有沒有辦法在ASP.NET MVC 4中綁定來自路由URL中的佔位符以外的來源的路由值:例如標題或發佈數據?或者它們內在地耦合到URL?可以將路由值綁定到URL的組件以外的值嗎?

具體而言,我有興趣重寫action路由值與張貼的表單字段的值。通過這種方式,您可以輕鬆地在頁面上擁有不同的提交按鈕,通過給每個nameactionvalue的操作名稱在控制器上調用不同的操作。

我已經嘗試在HttpModule中設置RouteData.Values,但是在管道中似乎爲時過早以覆蓋該操作。

回答

1

HttpModule確實爲此太早,實際上並不需要。你可以依靠常規的MVC路由處理機制,並簡單地提供你自己的從HTTP請求中提取的RouteValues

例如:

public class MyHeadersBasedRoute : RouteBase 
{ 
    public const string HEADER_CONTROLLER_KEY = "X-REQUESTED-CONTROLLER"; 
    public const string HEADER_ACTION_KEY = "X-REQUESTED-ACTION"; 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var requestedController = httpContext.Request.Headers[HEADER_CONTROLLER_KEY]; 
     var requestedAction = httpContext.Request.Headers[HEADER_ACTION_KEY]; 

     if (String.IsNullOrEmpty(requestedController) || String.IsNullOrEmpty(requestedAction)) 
      return null; 

     var ret = new RouteData(this, new MvcRouteHandler()); 

     ret.Values.Add("controller", requestedController); 
     ret.Values.Add("action", requestedAction); 

     // add any extra parameter from request, for example: 
     ret.Values.Add("id", httpContext.Request.Form["id"]); 

     return ret; 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     return null; 
    } 
} 

然後,只需註冊在你global.asax

RouteTable.Routes.Add(new MyHeadersBasedRoute()); 
+0

完美。謝謝! –

相關問題