RedirectToAction 和 RedirectToRoute

Posted

技术标签:

【中文标题】RedirectToAction 和 RedirectToRoute【英文标题】:RedirectToAction and RedirectToRoute 【发布时间】:2012-02-15 04:36:58 【问题描述】:

在我的网页 1 控制器中,我想重定向到网页 2,传递 2 个变量。

我尝试使用 RedirectToRoute,但无法正常工作;显示错误的 URL。 然后我切换到使用 RedirectToAction。

我的代码:

路由

routes.MapRoute(
    "CreateAdditionalPreviousNames", // Route name
    "Users/controller/action/userId/applicantId", // URL with parameters
    new  controller = "UsersAdditionalPreviousNames", action = "Index", userId = UrlParameter.Optional, applicantId = UrlParameter.Optional  // Parameter defaults
);

RedirectToAction(有效)

return RedirectToAction("Index", "UsersAdditionalPreviousNames", new  userId = user.Id, applicantId = applicant.Id );

RedirectToRoute(不起作用)

return RedirectToRoute("CreateAdditionalPreviousNames", new  userId = user.Id, applicantId = applicant.Id );

哦,还有一件事,你能把参数设置成必需的,而不是可选的……如果是这样,怎么做?

【问题讨论】:

如果他们不提供参数,你期望会发生什么?是的,这是可能的,但会发生 404 错误或类似的事情。这就是你想要的吗? 【参考方案1】:

省略参数默认值以使参数成为必需:

    routes.MapRoute(
    "CreateAdditionalPreviousNames", // Route name
    "Users/controller/action/userId/applicantId", // URL with parameters
    new  controller = "UsersAdditionalPreviousNames", action = "Index" 
);

对于路由重定向,试试这个:

return RedirectToRoute(new 
 
    controller = "UsersAdditionalPreviousNames", 
    action = "Index", 
    userId = user.Id, 
    applicantId = applicant.Id 
);

我从史蒂夫·桑德森那里学到的另一个习惯是不给你的路线命名。每个路由都可以有一个空名称,这使您可以显式指定所有参数:

    routes.MapRoute(
    null, // Route name
    "Users/controller/action/userId/applicantId", // URL with parameters
    new  controller = "UsersAdditionalPreviousNames", action = "Index" 
);

【讨论】:

感谢 Olivehour - 效果很好。只是想知道为什么我的 RedirectToRoute 版本不起作用,因为我遵循重载方法的签名......有什么想法吗?谢谢 @user1079925,就像我说的,我养成了不命名路由的习惯,所以我从不使用带路由名称的重载。希望其他人会回答谁可以告诉您那里出了什么问题。这可能是不给你的路线命名的原因之一,这个习惯让我得到了回报。 好的....我将带头并远离路线命名 - 似乎它是一种障碍而不是一种帮助。 这并没有回答问题中描述的问题的解决方案,那么如何将其标记为已接受的答案

以上是关于RedirectToAction 和 RedirectToRoute的主要内容,如果未能解决你的问题,请参考以下文章

跨控制器跳转view——RedirectToRoute和RedirectToAction

使用 RedirectToAction 时如何跳过控制器名称?

如何在 ASP.NET MVC 6 中继续使用 ModelState 和 RedirectToAction?

.NET MVC 是不是具有强类型的 RedirectToAction?

asp.net mvc: 将 RedirectToAction(string, object) 变成 RedirectToAction<Controller>(x => x.Deta

RedirectToAction 根本不起作用