2009-02-03 44 views
7

看起来似乎很简单,但事实并非如此 - 主要是由于View不可能知道你通过Model和Controller的方式。无论如何,这是一个需要解决方案的问题:如何为指向登录表单的链接指定返回网址?

我有一个登录链接,需要用户输入用户名和密码。当用户点击“提交”时,我想重定向到他正在查看的页面。最简单的方法似乎是将查询字符串指定给当前页面的URL(...?returnUrl=...),其他所有内容都已经构建好。

但是在渲染链接时,我从哪里可以找到这个URL?我自然不能使用RedirectToActionResult,因为我不想实际传输用户 - 只在链接中呈现URL。如何?


编辑:

我现在已经开始在这个问题上的赏金,因此,我认为适当的澄清我的需求也是如此。

我在我的Shared文件夹中有一个名为Login.ascx的UserControl。其中,我将一个ActionLink呈现给登录表单,并将其包含在我的主页面的页脚中。我想要完成的是以下内容:

当ActionLink被渲染时,查询字符串returnUrl附加了到目前正在渲染的视图的路径。如果这样做了,用户将被带回到他/她在成功登录后查看的页面中,该页面已经构建到ASP.NET MVC框架中。

之前的答案还没有足够的原因主要是他们没有提供一种方法来建立路径url到当前视图。我知道如何附加一个查询字符串,但我不知道如何找出该字符串的内容。

为了将答案标记为的答案,我想要一个方法来重新构建到当前显示的视图的路径,从masterpage中的usercontrol。

回答

20

的解决方案是使用HttpContext.Current.Request.RawUrl这样的:

<%= Html.ActionLink("log on", "LogIn", new { controller = "User", returnUrl = HttpContext.Current.Request.RawUrl }) %> 

或者与来自MVC futures(Microsoft.Web.Mvc.dll)的扩展方法:

<%= Html.ActionLink<AccountController>(c => c.LogOn("name", "password", false, HttpContext.Current.Request.RawUrl), "login here")%> 

ActionController是mvc中的默认选项,但只需将returnUrl添加到自己的。

3

一种方法是构建将用户发送到登录表单的链接,并返回returnUrl =/PageToReturnTo(例如,<a href="/Account/Login/?returnUrl=/Product/10">Login</a>)。你想写它,所以返回的URL是从你的路由构造的,但是手动在每个页面上写这些链接可能会很麻烦。

MVC中的默认登录操作已经创建了returnUrl功能。只需要传递一个值,剩下的就完成了。以下是新项目中方法签名的复制粘贴。

public ActionResult Login(string username, string password, bool rememberMe, string returnUrl) 

希望能帮助你!

+0

感谢您的回复!我已经得到了这么多 - 这是从我的路线构建returnUrl,我不知道该怎么做。该链接位于我的母版页上,因此对每个页面上的链接进行硬编码不是一种选择。 – 2009-02-03 08:06:20

+0

另外,ASP中的标准授权会将?returnURL添加到任何位于受保护区域中的请求(即具有带允许/拒绝规则的web.config文件)。 – 2009-02-13 15:01:36

0

我不知道ASPX,但也有一对夫妇,我们遇到了建立这个问题:

当用户得到他们的密码错误,并循环轮的登录页面有另一个去,目标必须保留。

我们还决定保留POST变量来一个网页,然后在需要的只是即时登录

1

您可以使用Page.Request.Url来获取导致当前渲染视图的路线。

虽然这更多的是一个美化的细节,但您可能希望统一通过“/”和“/default.aspx”路线发出的请求,并始终返回到“/”路线。我的母版页中有一个辅助属性,它就是这样做的。

protected Uri RouteUrl 
    { 
     get 
     { 
      if (Page.Request.Url.AbsolutePath.StartsWith("/default.aspx", StringComparison.OrdinalIgnoreCase)) 
      { 
       return new Uri(Request.Url, new Uri(Response.ApplyAppPathModifier("~/"))); 
      } 

      return Page.Request.Url; 
     } 
    }