我的剃刀视图中有一个链接:
<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();
}
在视图中我正在使用它:
@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
,其中带有查询字符串的网址就是这样。 /myApp/Home/Login?ReturnUrl=/Disputes/Index
我该如何解决这个问题?
答案 0 :(得分:44)
我结合使用上述建议和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");
}
}
答案 1 :(得分:7)
在这种情况下,您可以让LogOn操作采用returnUrl参数,如果它不为空,而不是重定向到Home / Index,则可以返回Redirect(returnUrl);
。在创建新项目时,请查看VS生成的默认AccountController。它正是如此。
答案 2 :(得分:6)
如果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();
}
答案 3 :(得分:1)
//Utilities
public static ReturnUrl GetReturnUrlValues(string returnUrl)
{
//0:Action,1:Controller,2:Area:,3:Id
ReturnUrl vm = new ReturnUrl();
using (TBBSEntities context = new TBBSEntities())
{
if (returnUrl != null && returnUrl.Length > 10)
{
var counterValue = returnUrl.Split('/');
vm.Action = counterValue[0];
vm.Controller = counterValue[1];
vm.Area = counterValue[2] == "0" ? "" : counterValue[2] ;
vm.Id = Convert.ToInt32(counterValue[3]);
vm.NullStatus = true;
return vm;
}
vm.NullStatus = false;
return vm;
}
}
//Controller
var transformUrl = Utilities.GetReturnUrlValues(returnUrl);
if (transformUrl.NullStatus)
{
return RedirectToAction(transformUrl.Action, transformUrl.Controller,
new { area = transformUrl.Area, id = transformUrl.Id });
}
return RedirectToAction("Action", "Controller", new { area = "Area", Id});
//View
var returnUrl = "Action/Controller/Area/" + @Model.Id;