MVC应用程序仅在服务器上为控制器操作返回404

问题描述

| 我有一个带有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参数动态检查匹配的视图并使用它,否则我会坚持使用认的\'Index \'视图。我正在使用标准路线映射来捕获此问题。 通常情况下,所有这些在本地都能很好地发挥作用。在访问Web服务器上的URL时出现问题。当我导航到“ Guides”操作时,一切正常,但是导航到“ discussions”操作,则返回404。奇怪的是,在服务器本身的浏览器中访问相同的URL可以正常工作! 它在Windows Server 2008 R2(IIS7)上运行,并且应用程序池设置为“集成”。它也是.Net 4上的MVC 3。 有人以前见过这样的东西吗,或者不知道如何诊断?我不确定从这里去哪里... 编辑: 好吧,为了简洁起见,我错过了一些我认为不相关的东西,我错了... 除了pageType参数外,还有一个可选类别。这将检查类别是否存在于数据库中,并将其添加到视图模型中。 在视图中,有一个对@ Html.RenderAction的调用,该调用将类别ID发送到另一个操作方法。我不确定为什么我要这样做,而不是只调用@ Html.Partial传入模型,但是嘿。无论如何,如果找不到类别,则此操作方法将返回HttpNotFound结果,即404。 我只是更改了\'child \'动作方法,以使用空对象作为模型(在我的情况下为新的空列表)返回部分视图,并解决了该问题。 花费了一些时间,但最终还是到了那里,以后,我将确保仅在确实需要执行初始控制器操作中无法完成的其他操作处理时才使用RenderAction。 当然,这无助于解释为什么在服务器上本地访问时它起作用。我猜想这一定与HttpNotFound结果有关。     

解决方法

        如果将呼叫从
Discussions
更改为
Index
会发生什么?如果您使用1而不是2,那会有什么不同?
public ActionResult Discussions()
{
    return Index(1);
}
    ,        因此,只是为了解决问题。在父视图中,我调用了
@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);
}