是否可以使用RedirectToAction清除路径值?

时间:2013-04-04 09:51:42

标签: asp.net-mvc routes

我想重定向到同一控制器中的某个操作,但丢失了路由值(特别是id值)。事实证明这非常困难。我有这样配置的路线:

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设置为null,并且奇怪地转向{{1进入查询字符串键。换句话说,它没有正确清除/删除id路由值。将id设置为传递给id的{​​{1}}对象中的空字符串只会产生与将其设置为routeValues相同的效果。

为什么这样做?如何说服它不匹配第一条路线,因为RedirectToAction已从路线值中完全删除?

1 个答案:

答案 0 :(得分:14)

感谢@Slicksim我发现答案是从RouteData.Values中删除密钥而不是将其设置为null:

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

    // (code to display status)
}