2012-03-04 98 views
25

后返回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

我该如何解决这个问题?

+0

尝试使用 disputes (使用“/”),或者甚至尝试使用任何查询字符串来测试UrlReferrer方法。 – Oliver 2012-03-04 12:14:27

+0

@Oliver:我尝试了没有查询字符串,它没有工作... – DotnetSparrow 2012-03-04 12:46:59

回答

39

我用上面的建议,并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"); 
     } 
    } 
+0

我在登录中使用了隐藏字段页面,现在我可以看到像这样的登录操作方法中的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

+0

在我的登录后操作,我有:string decodedUrl =“”; (!字符串。IsUullOrEmpty(returnUrl)) decodedUrl = Server.UrlDecode(returnUrl); (Url.IsLocalUrl(decodedUrl)) { return(Redirect(decodedUrl); } 这适用于我。该网址是否有效? – Oliver 2012-03-04 11:05:48

+0

我用我的post方法 – Oliver 2012-03-04 11:10:57

7

在这种情况下,您可以让您的LogOn操作采用returnUrl参数,如果它不是空的,而不是重定向到Home/Index,则可以返回Redirect(returnUrl);。当你创建一个新项目时,请看一下由VS生成的默认AccountController。它确实如此。

+0

感谢您的快速响应。我有这个书面但仍然returnUrl在行动方法是空的。我在href中创建了错误的返回地址吗?请建议 – DotnetSparrow 2012-03-04 10:40:23

+0

您可能需要对网址进行编码:'disputes'。 – 2012-03-04 10:43:40

+0

不,编码后的相同:登录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

5

如果ReturnURLnull,请确保您调用视图中的操作方法如下:

// 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(); 
} 
+0

是的,它是重要的是要得到这个权利。对我来说,在我的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

+0

在窗体上设置返回url对于我来说完美地工作,只需最少的代码更改。谢谢! – BrianLegg 2016-01-26 16:11:53

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;