重定向到登录
后返回URL我有这样对我的Razor视图链接:重定向到登录
<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();
}
鉴于我用这:
0:@Html.Hidden("returnUrl",@Request.QueryString)
在交动作方法
然后
它重定向到:/Disputes/Index
但它应该去myApp/Disputes/Index
其中与querystring的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值:ReturnUrl =%2fDisputes%2fIndex但它在此处失败:if(Url.IsLocalUrl(returnUrl)&& returnUrl.Length> 1 && returnUrl.StartsWith(“/”) &&!returnUrl.StartsWith(“//”)&&!returnUrl.StartsWith(“/ \\”)) return Redirect(returnUrl); – DotnetSparrow 2012-03-04 11:00:55
在我的登录后操作,我有:string decodedUrl =“”; (!字符串。IsUullOrEmpty(returnUrl)) decodedUrl = Server.UrlDecode(returnUrl); (Url.IsLocalUrl(decodedUrl)) { return(Redirect(decodedUrl); } 这适用于我。该网址是否有效? – Oliver 2012-03-04 11:05:48
我用我的post方法 – Oliver 2012-03-04 11:10:57
在这种情况下,您可以让您的LogOn操作采用returnUrl参数,如果它不是空的,而不是重定向到Home/Index,则可以返回Redirect(returnUrl);
。当你创建一个新项目时,请看一下由VS生成的默认AccountController。它确实如此。
感谢您的快速响应。我有这个书面但仍然returnUrl在行动方法是空的。我在href中创建了错误的返回地址吗?请建议 – DotnetSparrow 2012-03-04 10:40:23
您可能需要对网址进行编码:'disputes'。 – 2012-03-04 10:43:40
不,编码后的相同:登录action方法中的returnurl为null,其中querystring与returnurl是这样的:public ActionResult Login(LogOnModel model,string returnUrl)and/Home/Login?ReturnUrl = Disputes%2FIndex – DotnetSparrow 2012-03-04 10:50:36
如果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();
}
是的,它是重要的是要得到这个权利。对我来说,在我的HTML中设置类的匿名对象被用作路由值的匿名对象,所以ReturnUrl没有回来,而是在查询参数中看到'class'。最好查看最终呈现的标记。我使用这个: '@using(Html.BeginForm(“BetaLogin”,“Authentication”,new {ReturnUrl = this.Request.Params [“ReturnUrl”]},FormMethod.Post,new {@class =“o- box-section“}))' – 2014-08-13 17:40:59
在窗体上设置返回url对于我来说完美地工作,只需最少的代码更改。谢谢! – BrianLegg 2016-01-26 16:11:53
//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;
尝试使用 disputes (使用“/”),或者甚至尝试使用任何查询字符串来测试UrlReferrer方法。 – Oliver 2012-03-04 12:14:27
@Oliver:我尝试了没有查询字符串,它没有工作... – DotnetSparrow 2012-03-04 12:46:59