【问题标题】:Unable to fetch returnurl in asp.net mvc Controller无法在 asp.net mvc 控制器中获取 returnurl
【发布时间】:2016-09-22 13:44:45
【问题描述】:

我有两个控制器 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();
    }

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

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

【问题讨论】:

  • 什么是WSFederationConstants.Parameters.Action。如果该常量的值为"returnUrl",则它必须是return RedirectToAction("Start","Base", new { returnUrl = returnUrl });(你得到length=9,因为“returnUrl”中有9个字符)
  • 按照@StephenMuecke 的建议,我做到了并且能够在基本控制器中获取 url。但是获取的 url 格式不正确,它带有 '%2f%f wsignin...' 代替 /(斜杠)和 ?(问号),因此操作变量无法从查询字符串中获取操作。
  • 那是因为该方法对其进行了编码。但这样做的目的是什么?如果你有 returnUrl 的值,为什么不直接使用 return RedirectToLocal(returnUrl); 重定向到它 - 你的 start() 方法是做什么用的?
  • 我的url里面有很多参数,不仅仅是action参数,还有登录的参数。
  • 这有什么不同。

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


【解决方案1】:

您实际上是在向客户端返回 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会自动获取参数,不需要从查询字符串中获取。

【讨论】:

  • 我在 url 中有很多参数。我必须使用查询字符串来获取它们,并且按照斯蒂芬的建议,我能够在基本控制器中获取 url。但是获取的 url 格式不正确,它带有 '%2f%f wsignin...' 代替 /(斜杠)和 ?(问号),因此操作变量无法从查询字符串中获取操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多