我将用一个简单的例子来说明我要做什么。

我有路线

routes.MapRoute("",
                "Message",
                new { controller = "Home", action = "Index", myEnum = MyEnum.Message});

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


和动作

public ActionResult Index(/*other values*/, MyEnum? myEnum = null)
{
   // do some logic

   var redirectToHomeUrl = userLoggedIn && myEnum.HasValue && myEnum.Value == MyEnum.Message;

   if (redirectToHomeUrl)
   {
      // do some logic
      return RedirectToAction("Index"); <-- problem here
   }

   // Other logic
}


基本上,用户将发送到mysite.com/Message并注销,并在主页上显示模型对话消息。当他们根据此消息采取行动并重新登录时,页面将重新加载。我检测到它们仍然具有消息的URL,并希望将它们重定向回主URL“ mysite.com/”。

但是return RedirectToAction("Index")仍然保留myEnum = MyEnum.Message

重定向后RouteData仍然存在,所以我遇到了无限循环。

我试过了RedirectToRoute(null, new { action = "Index", controller = "Home"});

我试过了RedirectToAction("Index", new {})

我试过了RouteData.Values.Clear()

我试过了RouteData.Values["myEnum"] = null;

如果您想知道的RedirectToAction("Index", new { myEnum = null })无法编译:)

关于如何重定向到同一Action但要删除现有路由值的任何想法?

提前加油。

最佳答案

RedirectToAction("Index", new { myEnum = null })


可能不会编译,但是这样做:

RedirectToAction("Index", new { myEnum = (MyEnum?)null })


如果您想知道:)

我不明白重定向到相同动作的意义。如果只想删除一个值,请手动将其设置为null(或忽略它)。如果您实际上要调用其他函数(但动作相同)(似乎并非如此,但谁知道),只需直接从您的函数中返回该函数的结果即可。

10-02 22:21