2013-04-04 47 views
7

我想重定向到在同一個控制器的動作,但失去了路由值(尤其是id值)。事實證明,這非常困難。我配置了這樣的路線:是否可以使用RedirectToAction清除路由值?

context.MapRoute(
    "Monitoring_controllerIdSpecified", 
    "Monitoring/{controller}/{id}/{action}", 
    new { action = "Status" } 
); 

context.MapRoute(
    "Monitoring_default", 
    "Monitoring/{controller}/{action}", 
    new { controller = "Events", action = "Index" } 
); 

...和內部EventsController東西的操作方法是這樣的:

public ActionResult Status(int id) { 
    if (id > 1000) { 
     TempData["ErrorMessage"] = "ID too high."; 
     return RedirectToAction("Index", new { id = (int?)null }); 
    } 

    // (code to display status) 
} 

如果我再接入類似/Monitoring/Events/1001,該RedirectToAction確實調用,但我得到重定向到/Monitoring?id=1001而不是隻有/Monitoring。這似乎是相匹配的第一個路由,Monitoring_controllerIdSpecified,即使這條路線有id作爲強制性路線參數,我告訴它設置id爲空,而奇怪的是轉向id成一個查詢字符串鍵。換句話說,它沒有正確地清除/刪除id路由值。設置id在傳遞給RedirectToActionrouteValues對象爲空字符串只是給它設置爲null同樣的效果。

爲什麼這樣做的,我怎麼能說服它,因爲id已經完全從路由值去掉不符合第一條路線?

+0

你嘗試過重定向之前從routevaluedictionary取下標識? – Slicksim 2013-04-04 10:17:57

+0

您也可以嘗試'RedirectToRoute',而不是'RedirectToAction'。 – danludwig 2013-04-04 14:28:26

+0

@Slicksim你在說什麼'RouteValueDictionary'?你能舉一個你的意思嗎? – Jez 2013-04-08 08:53:41

回答

10

感謝@Slicksim我發現答案是消除來自RouteData.Values的關鍵,而不是將其設置爲空:

public ActionResult Status(int id) { 
    if (id > 1000) { 
     TempData["ErrorMessage"] = "ID too high."; 
     RouteData.Values.Remove("id"); 
     return RedirectToAction("Index"); 
    } 

    // (code to display status) 
} 
相關問題