C# 无法在asp.net mvc控制器中获取returnurl

C# 无法在asp.net mvc控制器中获取returnurl,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我有两个基本控制器和登录控制器 基本控制器: public ActionResult start() { string action = Request.QueryString[WSFederationConstants.Parameters.Action]; } public ActionResult Login(string user,string password,string returnUrl) { if (FormsAuthe

我有两个基本控制器和登录控制器

基本控制器:

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();
    }
public class BaseController: Controller
{
    public ActionResult start(string myAction)
    {
       string localAction = myAction; //myAction is automatically populated.
    }
}
登录控制器:

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();
    }
public class BaseController: Controller
{
    public ActionResult start(string myAction)
    {
       string localAction = myAction; //myAction is automatically populated.
    }
}
身份验证完成后,它将被重定向,以按预期在基本控制器中启动操作。 但是querystring不能获取值。当鼠标悬停在查询字符串上时,它显示长度值,但不显示uri


如何使用从基本控制器中的登录控制器发送的url并从中获取参数?

您实际上是在向客户端返回302。 从

向浏览器返回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 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();
    }
public class BaseController: Controller
{
    public ActionResult start(string myAction)
    {
       string localAction = myAction; //myAction is automatically populated.
    }
}
在你的重定向中:

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

然后,
BaseController
将自动获取参数,您不需要从querystring获取参数。

您实际上是在向客户端返回302。 从

向浏览器返回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 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();
    }
public class BaseController: Controller
{
    public ActionResult start(string myAction)
    {
       string localAction = myAction; //myAction is automatically populated.
    }
}
在你的重定向中:

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

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

什么是
WSFederationConstants.Parameters.Action
。它需要是
returnredirectotoaction(“Start”,“Base”,new{returnUrl=returnUrl})
如果该常量的值是@StephenMuecke建议的
“returnUrl”
(因为“returnUrl”中有9个字符,所以您得到的
长度=9
),我就这样做了,并且能够在基本控制器中获得url。但是获取的url格式不正确,它使用“%2f%f wsignin…”代替/(斜杠)和?(问号),因此操作变量无法从querystring获取操作。这是因为该方法对其进行了编码。但这样做的目的是什么?如果您有
returnUrl
的值,为什么不使用
return RedirectToLocal(returnUrl)重定向到它-您的
start()
方法用于什么?我在url中有许多参数。它不仅仅是操作参数。它还有用于执行登录的参数。这有什么区别。什么是
WSFederationConstants.parameters.action
。它需要是
returnredirectotoaction(“Start”,“Base”,new{returnUrl=returnUrl})
如果该常量的值是@StephenMuecke建议的
“returnUrl”
(因为“returnUrl”中有9个字符,所以您得到的
长度=9
),我就这样做了,并且能够在基本控制器中获得url。但是获取的url格式不正确,它使用“%2f%f wsignin…”代替/(斜杠)和?(问号),因此操作变量无法从querystring获取操作。这是因为该方法对其进行了编码。但这样做的目的是什么?如果您有
returnUrl
的值,为什么不使用
return RedirectToLocal(returnUrl)重定向到它-你的
start()
方法用于什么?我在url中有许多参数。它不仅仅是操作参数。它有参数来执行登录。这有什么区别。我在url中有许多参数。我必须使用querystring获取它们,正如stephen所建议的那样,我能够在Base Controller中获取url。但是获取的url格式不正确,它使用“%2f%f wsignin…”代替/(斜杠)和?(问号),因此操作变量无法从querystring获取操作。我在url中有许多参数。我必须使用querystring获取它们,正如stephen所建议的那样,我能够在Base Controller中获取url。但是获取的url格式不正确,它使用“%2f%f wsignin…”代替/(斜杠)和?(问号),因此操作变量无法从querystring获取操作。