3

我想我的 MVC 路由可能有点麻烦。请注意,我正在使用带有 Razor 视图的 ASP.NET MVC 4。

我的路线注册如下:

    routes.MapRoute(
        "Person",
        "Person/Show/{uniqueId}",
        new { controller = "Person", action = "Show", uniqueId = "" }
        );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional}
        );

我的 PersonController 实现如下:

[HandleError]
public class PersonController{
    public ActionResult Show(string uniqueId)
    {
        //get data from database
        var personData = GetPersonDataFromDatabase(uniqueId);

        return View("PersonView", new PersonViewModel(personData));       
    }
}

这应该显示具有 _LayoutContent.cshtml 布局的 PersonView.cshtml,而后者又具有 _Layout.cshtml 布局。

不幸的是,我无法看到该页面....除非我已登录。而且我不知道为什么会有所不同...

当我在未登录时尝试加载页面时,我被发送到此页面:

http://mymachine:8083/?ReturnUrl=%2fPerson%2fShow%2fvXDwucay

当我使用 Fiddler 查看正在发生的事情时,我可以看到发生了以下情况:

  1. 302, HTTP, mymachine:8083, /Person/Show/vXDwucay
  2. 200, HTTP, mymachine:8038, /?ReturnUrl=%2fPerson%2fShow%2fvXDwucay

对于 HTTP 302,我可以看到它返回以下内容:

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/?ReturnUrl=%2fPerson%2fShow%2fvXDwucay">here</a>.</h2>
</body></html>

有人可以指出可能导致此问题的正确方向吗?我觉得奇怪的是,登录会导致路由正常工作。我确定我一定是在做一些非常简单的错误……或者我没有在正确的地方寻找问题。

4

1 回答 1

3

我终于找到了解决我的问题的方法。我能够将我的问题追踪到一个特定的修订版……在大量盯着代码之后,我终于能够对解决方案有了顿悟。

我在这里发布解决方案,以防其他人将来遇到这个问题。

在“PersonView”中,我显示了一个返回一些数据的局部视图,如下所示:

@Html.Action("SomeListPartial", "Other")

当我读到那个时,在我的脑海里我错误地认为它是 @Html.ActionLink 方法,它只是提供了一个页面的超链接......@Html.Action 方法而不是“调用指定的子操作方法使用指定的控制器名称并将结果作为 HTML 字符串返回。” ...这意味着它执行操作并取回生成的 html 以显示在屏幕上。

当我查看被调用的操作时,事实证明我已经(正确地)在其上放​​置了一个 [Authorized] 属性......这就是它在未登录时失败的原因。

现在我不完全确定为什么错误没有更明显......但我认为我的网站中一定有一些东西会进行重定向,这就是为什么我被自动带到 ?ReturnUrl=%2fPerson%2fShow %2fvXDwucay

于 2013-05-12T12:14:02.013 回答