2011-09-15 132 views
2

我在Global.asax的默認路由定義重定向路由值

routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 

我需要做到這一點。

/somecontroller/edit/1 - 當ID是那麼一批讓它去 /somecontroller/edit/xxxx - 當ID是一個字符串,然後將其重定向到/somecontroller/xxxx

,只有當動作叫做編輯。

+0

請說明你想達到的目標。爲什麼你需要將請求重定向到'somecontroller/edit/xxxx'?你需要在你的Controller中調用一個不同的'Edit'方法,其中id是一個字符串? – counsellorben

回答

2

RegisterRoutes方法URL轉換爲名稱和控制器的值,動作和其他參數。
您可以編寫自己的地圖路線邏輯 - 首先滿足的行將進行。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

// empty url is mapping to Home/Index 
routes.MapRoute(null, "", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

// accepts "Whatever/Edit/number", where Whatever is controller name (ie Home/Edit/123) 
routes.MapRoute(null, 
     // first is controller name, then text "edit" and then parameter named id 
     "{controller}/edit/{id}", 
     // we have to set action manually - it isn't set in url - {action} not set 
     new { action = "edit"}, 
     new { id = @"\d+" }  // id can be only from digits 
    ); 


// action name is AFTER edit (ie Home/Edit/MyActionMethod) 
routes.MapRoute(null, "{controller}/edit/{action}"); 

// default action is index -> /Home will map to Home/Index 
routes.MapRoute(null, "{controller}", new{action="Index"}); 

// accepts controller/action (Home/Index or Home/Edit) 
routes.MapRoute(null, "{controller}/{action}");     

// controller_name/action_name/whatever, where whatever is action method's id parameter (could be string) 
routes.MapRoute(null, "{controller}/{action}/{id}");    
+0

你能解釋一下代碼在做什麼嗎? – user256034

+0

增加了更多解釋。它也只接受「編輯」的重新路由。 – Filias

2

也許你不能通過路線處理它。你需要在Edit動作中檢查它並在字符串值的情況下重定向到Index動作,否則處理編輯動作。

路由約束

public class IsIntegerConstraint : IRouteConstraint 
{ 
    #region IRouteConstraint Members 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     int result; 

     return int.TryParse(values[parameterName].ToString(), out result); 
    } 

    #endregion 
} 

路由

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new { id = new IsIntegerConstraint() } 
     ); 
+0

我在想,也許我可以在一些自定義IRouteConstraint派生類中做到這一點? – user256034

+0

可能是的。我已經添加了一些示例,但我沒有更改來檢查它。 – Samich

+0

嗯,當它是一個數字我返回true,執行過程停止。 – user256034