У меня есть ссылка в моем представлении бритвы, например:
<a href="Home/Login?ReturnUrl=Disputes/Index"> disputes</a>
Внутри метода действия моего входа в систему я использую это:
public ActionResult Login(string returnUrl) {
if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null)
returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery);
if (Url.IsLocalUrl(returnUrl) && !string.IsNullOrEmpty(returnUrl))
{
ViewBag.ReturnURL = returnUrl;
}
return View();
}
В представлении I я использую это:
@Html.Hidden("returnUrl",@Request.QueryString)
Затем в методе действия после публикации:
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (membershipService.ValidateUser(model.UserName, model.Password, model.Type))
{
formsAuthenticationService.SignIn(model.UserName, model.RememberMe);
SetUserInfo(model.UserName);
string decodedUrl = "";
if (!string.IsNullOrEmpty(returnUrl))
decodedUrl = Server.UrlDecode(returnUrl);
if (Url.IsLocalUrl(decodedUrl))
return Redirect(decodedUrl);
else
return Redirect("Home", Index);
}
}
}
Он перенаправляется на: /Disputes/Index
, но он должен перейти на myApp/Disputes/Index
, где URL-адрес со строкой запроса выглядит так. /myApp/Home/Login?ReturnUrl=/Disputes/Index
Как решить эту проблему?
Я использую комбинацию вышеупомянутого предложения и Request.UrlReferrer
, чтобы получить предыдущее местоположение:
public ActionResult LogOn(string returnUrl)
{
//So that the user can be referred back to where they were when they click logon
if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null)
returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery);
if (Url.IsLocalUrl(returnUrl) && !string.IsNullOrEmpty(returnUrl))
{
ViewBag.ReturnURL = returnUrl;
}
return View();
}
Таким образом, мне не нужно помещать местоположение в ActionLink
.
Я заполняю скрытое поле на странице входа в систему, используя ViewBag.ReturnURL
. Затем в HTTPPost для входа в систему ActionResult
я перенаправляю пользователя в местоположение в скрытом поле (если оно есть):
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
//returnURL needs to be decoded
string decodedUrl = "";
if (!string.IsNullOrEmpty(returnUrl))
decodedUrl = Server.UrlDecode(returnUrl);
//Login logic...
if (Url.IsLocalUrl(decodedUrl))
{
return Redirect(decodedUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
Если ReturnURL
равно null
, убедитесь, что вы вызываете метод действия из представления следующим образом:
// FormMethod.post is optional
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
{
// login view html
}
Контроллер аккаунта:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}