MVC应用程序仅在服务器上为Controller Action返回404

时间:2011-05-30 16:31:33

标签: asp.net-mvc-3

我有一个带有2个动作的控制器,每个动作在设置给定参数后都会从Index动作返回响应。

public ActionResult Index(int? pageType)
{
    // Do something based on the pageType
    return View();
}

public ActionResult Guides()
{
    return Index(1);
}

public ActionResult Discussions()
{
    return Index(2);
}

我这样做的原因是为了使Url更清洁而不会过多地处理路由(将路由设置为接受页面类型作为字符串参数会将事务与映射到控制器操作混淆,并且我希望url为显示页面类型)

只是为了混淆事物,我根据pageType参数动态检查匹配的视图并使用它,否则我坚持默认的“索引”视图。我正在使用标准路由映射来捕获它。

通常情况下,这一切都在当地非常有效。访问Web服务器上的Url时出现问题。当我导航到“指南”操作时,一切正常,但导航到“讨论”操作会返回404.奇怪的是,在服务器上的浏览器中访问相同的Url本身工作正常!

它在Windows Server 2008 R2(IIS7)上运行,应用程序池设置为Integrated。它也是.Net 4上的MVC 3。

有没有人见过这样的事情或者有任何想法如何诊断?我不知道从哪里开始......

修改

好的,为了简洁,我错过了一些我认为不相关的事情,我错了......

除了pageType参数外,还有一个可选类别。这将检查数据库中是否存在该类别,并将其添加到视图模型中。

在视图中,调用 @ Html.RenderAction ,将类别ID发送给另一个操作方法。我不知道为什么我这样做,而不是只是调用 @ Html.Partial 传递模型,但是嘿。无论如何,如果找不到该类别,此动作方法返回 HttpNotFound 结果,因此为404.

我刚刚更改了'child'动作方法,使用空对象作为模型返回局部视图(在我的情况下是一个新的空列表)并修复了问题。

我花了一些时间进行挖掘但最终到达那里,将来我肯定只有在我真正需要进行额外的动作处理时才能使用RenderAction,这在初始控制器动作中无法完成。 / p>

当然,这无助于解释为何在服务器上本地访问时有效。我想这必须与 HttpNotFound 结果有关。

2 个答案:

答案 0 :(得分:2)

如果您将来自Index的来电更改为Discussions会怎样?如果使用1代替2,那会有所作为吗?

public ActionResult Discussions()
{
    return Index(1);
}

答案 1 :(得分:2)

所以,只是为了解决这个问题。在父视图中,我打电话给@Html.RenderAction,后者又执行以下代码:

public ActionResult SubCategories(string categoryName)
{
    Category category = CategoryRepository.GetCategory(categoryName);
    if (category == null)
        return HttpNotFound();

    return PartialView("Categories", category.SubCategories);
}

这返回了一个HttpNotFound() ActionResult,这反过来导致了父视图的404。

我将代码更改为使用空列表作为模型(如果找不到)并解决了问题。

public ActionResult SubCategories(string categoryName)
{
    IList<Category> subCategories = new List<Category>();

    Category category = CategoryRepository.GetCategory(categoryName);
    if (category != null)
        subCategories = category.SubCategories;

    return PartialView("Categories", subCategories);
}