我使用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中的有效路径。
答案 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,但它按预期工作。