使用UrlReferrer返回区域内的呼叫页面

时间:2010-12-10 16:21:58

标签: asp.net asp.net-mvc-2 areas

我使用ASP.NET MVC2 Web应用程序创建了一个新的MVC2项目,它为我提供了默认的Web站点。我添加了一个简单的区域,其中我有一个Home Controller和一个Index视图。这标志着编译器给出的第一个问题“发现多个类型与控制器名称'Home'相匹配”。我将Home改为Main并编译。

我添加了一个新选项卡以引用我所在区域的索引视图,打开网站并开始单击选项卡。当我访问区域索引页面时,我无法在不更改菜单的情况下返回主页或关于页面,如下所示:

<ul id="menu">              
     <li><%= Html.ActionLink("SampleArea.Main", "Index", "Main", new { area = "SampleArea" }, null)%></li>
     <li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li>
     <li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li>
</ul>

然后我可以正确地循环选项卡。然后,我更改了帐户控制器中LogOff视图中的代码,如下所示:

public ActionResult LogOff()
{
    FormsService.SignOut();

    //return RedirectToAction("Index", "Home");
    return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString());
}

如果用户注销,我正在使用UrlReferrer.AbsolutePath返回调用页面。如果调用页面恰好是SampleArea中的View,则.AbsolutePath包含“/ SampleArea”。这是因为控制器和视图是默认值,因此不包括它们。随着它的继续,我收到以下错误消息:

  

无法找到资源   描述:HTTP 404.资源   你正在寻找(或其中一个   依赖)可能已被删除,   它的名字改了,或者是   暂时不可用。请   查看以下网址并确保   拼写正确。

     

请求的网址:/ Account / SampleArea

我的理解是/添加了帐户,因为这是执行LogOff时的控制器。它认为/ SampleArea是一个动作,因此添加了当前控制器来完成路线。

使用UrlReferrer.AbsolutePath,有什么办法可以将SampleArea指定为一个区域,还是我可以做些什么来返回正确的页面?

新增
这比我想象的更奇怪。我打开了我正在开发的网站,并在视图LogOut中更改了返回语句以使用AbsolutePath返回。断点显示它包含“/ Club / PrivacyPolicy”。但是,我收到相同的错误消息,但有以下区别:

  

请求的网址:/ Login / Club / PrivacyPolicy

为什么它的前缀应该是/ Login这是一个View,而不是/ Account是一个控制器?事实上,为什么它应该以任何东西作为前缀呢? /俱乐部/个人信息保护  是Global.asax.cs中的有效路径。

1 个答案:

答案 0 :(得分:0)

我终于想出了如何在您触发LogOn或LogOut请求时返回到您所在的页面。我使用了以下代码。

Html.ActionLink("Member LogOn", "LogOn", "Account", new { area = "", returnUrl = HttpContext.Current.Request.RawUrl }, null)

这会生成

<a href='/LogIn/LogOn?returnUrl=%2FContactUs'>Member LogOn</a>
例如,

在我的HttpPost ActionResult LogOn中,我有

if (!String.IsNullOrEmpty(returnUrl))
{
    return Redirect(returnUrl);
}
    else
{
    return RedirectToAction("Index", "Home");
}

有时候我发现我只需要HttpContext.Request.RawUrl。

我不太清楚为什么它生成了/ LogIn / LogOn而不是/ Account / LogOn,但它按预期工作。