Приложение MVC возвращает 404 для действия контроллера только на сервере - PullRequest
0 голосов
/ 30 мая 2011

У меня есть контроллер с 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, и использую его, в противном случае я придерживаюсь представления «Индекс» по умолчанию.Я использую стандартное отображение маршрутов, чтобы поймать это.

Как это часто бывает, все это прекрасно работает локально.Проблема возникает при доступе к URL на веб-сервере.Когда я перехожу к действию «Руководства», все работает нормально, однако при переходе к действию «Обсуждения» возвращается значение 404. Странно то, что доступ к одному и тому же URL-адресу в браузере на самом сервере работает нормально!

Он работает на Windows Server 2008 R2 (IIS7) с установленным пулом приложений «Интегрировано».Это также MVC 3 в .Net 4.

Кто-нибудь видел что-то подобное раньше или есть идеи, как поставить диагноз?Я не уверен, куда идти отсюда ...

РЕДАКТИРОВАТЬ:

ОК, поэтому для краткости я пропустил некоторые вещи, которые я не считаю актуальнымикак я ошибался ...

В дополнение к параметру pageType есть еще и необязательная категория.Это проверяет, что категория существует в БД, и добавляет ее в модель представления.

В представлении существует вызов @Html.RenderAction, который отправляет идентификатор категории в другой метод действия.Я не уверен, почему я сделал это так, вместо того, чтобы просто позвонить @Html.Partial и передать модель, но эй.В любом случае, если категория не была найдена, этот метод действия вернул результат HttpNotFound , следовательно, 404.

Я просто изменил метод действия 'child', чтобы он возвращал частичное представление, используя пустой объекткак модель (новый пустой список в моем случае), и это решило проблему.

Потребовалось немного покопаться, но я попал туда в конце, в будущем я обязательно буду использовать RenderAction только тогда, когдаМне действительно нужно выполнить дополнительную обработку действий, которую нельзя выполнить в начальном действии контроллера.

Конечно, это не помогает объяснить, почему это работало при локальном доступе на сервере.Я думаю, это должно быть связано с результатом HttpNotFound .

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Итак, просто чтобы решить вопрос. В родительском представлении у меня был вызов @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);
}
2 голосов
/ 30 мая 2011

Что произойдет, если вы измените вызов на Index с Discussions?Если вы используете 1 вместо 2, это имеет значение?

public ActionResult Discussions()
{
    return Index(1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...