我使用 ASP.NET MVC2 Web 应用程序创建了一个新的 MVC2 项目,它为我提供了默认网站。我添加了一个简单的区域,其中有一个 Home Controller 和一个 Index 视图。这导致了编译器给出的第一个问题“找到了与控制器名称'Home'匹配的多种类型”。我将 Home 更改为 Main 并编译。
我添加了一个新选项卡来引用我所在区域的索引视图,打开网站并开始单击选项卡。访问Area index页面时,如果不更改菜单就无法返回Home或About页面,如下:
<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>
然后我可以正确地循环浏览选项卡。然后,我在 Account 控制器的 LogOff 视图中更改了代码,如下所示:
public ActionResult LogOff()
{
FormsService.SignOut();
//return RedirectToAction("Index", "Home");
return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString());
}
如果用户注销,我正在使用 UrlReferrer.AbsolutePath 返回调用页面。如果调用页面恰好是 SampleArea 中的视图,.AbsolutePath 包含“/SampleArea”。这是因为控制器和视图是默认的,所以它们不包括在内。随着它的继续,我收到以下错误消息:
无法找到该资源。
说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。请求的 URL:/Account/SampleArea
我的理解是 /Account 已添加,因为这是执行 LogOff 时它所在的控制器。它认为 /SampleArea 是一个动作,因此添加了当前控制器来完成路由。
使用 UrlReferrer.AbsolutePath,有什么方法可以将 SampleArea 指定为一个区域,或者我可以做些什么来返回正确的页面?
新加法
这比我想象的还要奇怪。我打开了我目前正在开发的网站,并将视图 LogOut 中的 return 语句更改为使用 AbsolutePath 返回。断点显示它包含“/Club/PrivacyPolicy”。但是,我收到相同的错误消息,但有以下区别:
请求的 URL:/Login/Club/PrivacyPolicy
为什么它应该在它前面加上 /Login 是一个视图,而不是 /Account 是一个控制器?事实上,它为什么要在它前面加上任何东西呢?/Club/PrivacyPolicy 是 Global.asax.cs 中的有效路由。