无法在asp.net mvc Controller中获取returnurl

时间:2016-05-25 06:01:22

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有两个控制器Base和Login。

基础控制器:

public ActionResult start()
    {
       string action = Request.QueryString[WSFederationConstants.Parameters.Action];
    }

登录控制器:

 public ActionResult Login(string user,string password,string returnUrl)
    {
        if (FormsAuthentication.Authenticate(user, password))
        {

            if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null)
                returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery);

           return RedirectToAction("Start","Base", returnUrl });
        }
        return View();
    }

完成身份验证后,它会按预期重定向到Base Controller中的Start操作。 但是查询字符串不能获取值。当悬停在查询字符串上时,它显示长度值,但不显示uri。

如何使用从Base Controller中的Login控制器发送的url并从中获取参数?

1 个答案:

答案 0 :(得分:0)

您实际上是将302返回给客户端。 来自docs

  

返回对浏览器的HTTP 302响应,从而导致浏览器   向指定的操作发出GET请求。

当这样做时,客户端将使用您创建的URL发出另一个请求。在你的情况下,像youruri.org/Base/Start。请查看浏览器中的网络标签(Chrome中的F12)。

我认为你想做的是:

return RedirectToAction
  ("Start", "Base", new { WSFederationConstants.Parameters.Action = returnUrl  });

假设WSFederationConstants.Parameters.Action是常数。如果WSFederationConstants.Parameters.Action返回字符串fooUrl,您的操作会将以下内容返回给浏览器:

Location:/Base/Start?fooUrl=url
Status Code:302 Found

另一种选择是将值实际传递给控制器​​:

public class BaseController: Controller
{
    public ActionResult start(string myAction)
    {
       string localAction = myAction; //myAction is automatically populated.
    }
}

在你的重定向中:

return RedirectToAction
  ("Start", "Base", new { myAction = returnUrl  });

然后BaseController会自动获取参数,而您不需要从查询字符串中获取它。