2011-07-06 64 views
8

我想用MVC正確使用REST的網址。要做到這一點,我切換默認路由來自:切換到{controller}/{id}/{action}休息RedirectToAction

{controller}/{action}/{id} 

{controller}/{id}/{action} 

所以不是:

/Customer/Approve/23 

現在有

/Customer/23/Approve 

ActionLink的似乎工作確定,但CustomerControlle中的以下代碼r:

[CustomAuthorize] 
[HttpGet] 
public ActionResult Approve(int id) 
{ 
    _customerService.Approve(id); 
    return RedirectToAction("Search"); //Goes to bad url 
} 

以url結尾/Customer/23/Search。雖然它應該去/Customer/Search。不知何故,它記得23 (id)

這裏是global.cs

routes.MapRoute(
     "AdminRoute", // Route name 
     "{controller}/{id}/{action}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     new { id = new IsIntegerConstraint() } 
     ); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}", 
     new { controller = "Home", action = "Index" }); 

我的路由代碼,如果我轉了兩個函數,RedirectToAction開始工作,但使用:

Html.ActionLink("Approve", "Approve", new { Id = 23}) 

現在產生/Customer/Approve?id=23,而不是/Customer/23/Approve

我可以直接指定的URL像~/Customer/23/Approve,而是採用ActionLinkRedirectToAction,但寧願堅持通過MVC提供的功能。

+2

不知該ID的UrlParameter.Optional對這個 –

+0

怪異的是,任何影響UrlParameter只有一個值「可選」,像「必需」這樣的東西可能會使它工作。 –

回答

1

嘗試通過在新的(空)RouteValueDictionary在控制器

return RedirectToAction("Search", new System.Web.Routing.RouteValueDictionary{}); 

在這裏:

Html.ActionLink("Approve", "Approve", new { Id = 23}) 

我甚至不知道如何可以拿起客戶控制器,因爲你是沒有指定任何地方。嘗試向ActionLink助手提供控制器和動作。

+0

如果您在控制器內調用RedirectToAction(「action」),則ControllerName是可選的。如果你在控制器的視圖中執行ActionLink,似乎工作原理是一樣的。它只是使用電流控制器。 –

+0

是的,但對於額外的確定性水平,您應該在您無法解釋的問題掙扎時指定控制器,您不覺得嗎? – mare

+0

「確定性的額外水平」的好處。我嘗試添加控制器名稱,但沒有更改。 –

1

當您在內部使用RedirectToAction()時,MVC將採用現有的路由數據(包括Id值)來構建url。即使您傳遞了空的RouteValueDictionary,現有的路線數據也會與新的空路線值數據合併。

解決這個我能看到的唯一方法是使用RedirectToRoute(),如下所示:

return RedirectToRoute("Default", new { controller = "Customer", action = "Search"}); 

counsellorben

+0

不幸的是,仍然保持URL中的客戶id,結束於/ Customer/23/Search –

0

嘗試通過當前的路由數據在你的控制器動作methon:

return RedirectToAction("Search", this.RouteData.Values); 
+0

感謝您的回覆。我嘗試過,但同樣的問題。 –

0

刪除該零件:

id = UrlParameter.Optional 

可能會解決問題;當你將「id」定義爲一個可選參數,並且你有「Default」映射時,「Default」和「AdminRoute」在一起! 關於。

0

我有類似的問題。當我試圖用RedirectToAction重定向用戶時,即使我沒有在新的RouteValueDictionary中指定它們,也會重用傳遞給我的控制器操作的路由值。我想出的解決方案(在閱讀 counsellorben的帖子後)是清除當前請求的RouteData。這樣,我可以停止MVC合併我沒有指定的路由值。

所以,在你的情況,也許你可以做這樣的事情:

[CustomAuthorize] 
[HttpGet] 
public ActionResult Approve(int id) 
{ 
    _customerService.Approve(id); 
    this.RouteData.Values.Clear(); //clear out current route values 
    return RedirectToAction("Search"); //Goes to bad url 
} 
0

我有一個類似的問題,並能夠通過添加ID爲默認路由,以及解決它。

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

如果真的在你的默認路由沒有ID,那麼你可以搜索:

routes.MapRoute(
    "Default", 
    "{controller}/{action}", 
    new { controller = "Home", action = "Index", id = string.Empty });