11

我想重定向到同一个控制器中的一个动作,但丢失了路由值(特别是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/1001RedirectToAction确实会调用 ,但我会被重定向到/Monitoring?id=1001而不是仅仅/Monitoring. 它似乎与第一个路由匹配Monitoring_controllerIdSpecified,即使该路由具有id强制路由参数并且我告诉它设置id为 null,并且奇怪地id变成了查询字符串键。换句话说,它没有正确清除/删除id路由值。在传递给的对象中设置id为空字符串与将其设置为.routeValuesRedirectToActionnull

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

4

1 回答 1

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)
}
于 2013-04-08T10:42:02.223 回答