跳转到动作和跳转到路由

23
在我的网页1的控制器中,我想要重定向到网页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 });

还有一件事,你能将参数设为必填项而不是可选吗?如果可以,怎么做?


1
如果他们不提供参数,你希望发生什么?是的,这是可能的,但所有会发生的事情就是会出现404错误或类似的情况。这是你想要的吗? - Erik Funkenbusch
1个回答

27
省略参数默认值以使参数成为必需项:
    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 
});

我从 Steve Sanderson 那里学到的另一个习惯是不给路由命名。每个路由可以有一个空名称,这样你就需要明确地指定所有参数:

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

谢谢olivehour - 那个很好用。 只是想知道为什么我的RedirectToRoute版本不起作用,因为我正在遵循重载方法的签名...有什么想法吗? 谢谢 - user1079925
@user1079925,就像我说的那样,我养成了不给路由命名的习惯,所以我从来不使用带有路由名称的重载。希望其他人能回答你出了什么问题。这可能是不给路由命名的原因之一,这个习惯对我很有好处。 - danludwig
好的...我会跟随你的建议,放弃路由命名 - 看起来更像是一种阻碍而不是帮助。 - user1079925
7
这并没有回答问题描述中的解决方案,那么这怎么能被标记为已接受的答案呢? - Lijin Durairaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接