如何在asp.net MVC中使用Server.Transfer方法?

6

我正在尝试将其用于登录页面。

if (Session["UserID"] == null)
     Server.Transfer("/Account/Login", true);

但我收到了异常 -> 执行子请求/Account/Login时出错。


1
我赞同Mark的回答。我会使用"return RedirectToAction("SomeOtherAction");"。您不想让访问者看到重定向的URL吗? - Jarrett Meyer
3个回答

10

你需要这样做!

        return new MVCTransferResult(...);
请查看我的回答(链接在此)以及被接受的回答。

9

要使用服务器转移方法,您可以查看Simon Weaver的这篇文章,但在您的问题背景下,我建议使用重定向操作。

RedirectToAction(new {
   controller="Account", 
   action="Login"
});

为了使其告诉登录控制器返回哪里尝试

RedirectToAction( new {
   controller="Account",
   action="Login",
   new RouteValueDictionary { 
      {"actionToGoBackTo", "theActionName"},
      {"controllerToGoBackTo", "theControllerName"}
   }); 

请注意,登录操作需要传递两个字符串参数:actionToGoBackTo 和 controllerToGoBackTo。

其实我正在尝试解决这个问题 -> http://stackoverflow.com/questions/846775/how-to-redirect-user-to-the-page-where-session-expires-after-logged-in - Vikas
抱歉耽搁了。你可以在新的RouteValueDictionary中传递控制器和操作名称,然后重定向到此处,无需在MVC中过多处理URL。 - Mark Dickinson
1
感谢您的关注。我按照您的指示进行操作,但是仍然有一个问题,即如何在使用“提交”输入类型的表单数据中保留这些数据? - Vikas
1
虽然这个答案对OP'r有帮助,但对于那些试图为自己的目的找到相同问题答案的人来说是没用的。RedirectToAction实际上发出了301/302重定向,而不是原问题的答案。Server.Transfer在没有HTTP chatter的情况下静默地处理备用处理程序,这对于您不想让处理后的处理程序再次通过路由引擎很重要。 - Jon Davis
刚刚检查了一下,但问题从未提到过对啰嗦的HTTP的担忧。另外,快速阅读揭示了有关301在登录序列的一部分中会发生什么的有趣信息https://dev59.com/xnI-5IYBdhLWcg3wsKr9(不是说对或错,只是有趣 :)) - Mark Dickinson
显示剩余4条评论

5
您应该在使用Server.Transfer时得到与您想要的完全相同的结果。
public ActionResult Index() {
    ......
      var url = "/MyContoller?param=xxx";
      Server.TransferRequest(url, true);
      return new EmptyResult();
}

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