#asp.net-mvc-3
#asp.net-mvc-3
Вопрос:
У меня есть контроллер с двумя действиями, каждое из которых возвращает ответ от индексного действия после установки заданного параметра.
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’ по умолчанию. Я использую стандартное сопоставление маршрутов, чтобы перехватить это.
Как это часто бывает, все это прекрасно работает локально. Проблема возникает при доступе к URL на веб-сервере. Когда я перехожу к действию «Руководства», все работает нормально, однако переход к действию «Обсуждения» возвращает 404. Странно то, что доступ к одному и тому же URL в браузере на самом сервере работает нормально!
Оно работает на Windows Server 2008 R2 (IIS7) с пулом приложений, установленным на интегрированный. Это также MVC 3 на .Net 4.
Кто-нибудь видел что-нибудь подобное раньше или имеет какие-либо идеи, как диагностировать? Я не уверен, куда идти дальше…
Редактировать:
Хорошо, итак, для краткости я пропустил некоторые вещи, которые, по моему мнению, не имели значения, насколько я был неправ…
В дополнение к параметру PageType существует также необязательная категория. Это проверяет, существует ли категория в базе данных, и добавляет ее в модель представления.
В представлении есть вызов @Html.RenderAction, который отправляет идентификатор категории другому методу действия. Я не уверен, почему я сделал это таким образом, вместо того, чтобы просто вызвать @Html.Partial, передавая в модели, но привет. В любом случае, если категория не была найдена, этот метод action вернул результат HttpNotFound, следовательно, 404.
Я только что изменил «дочерний» метод действия, чтобы вернуть частичное представление, используя пустой объект в качестве модели (новый пустой список в моем случае), и это устранило проблему.
Потребовалось немного покопаться, но в конце концов я добился своего, в будущем я обязательно буду использовать RenderAction только тогда, когда мне действительно нужно выполнить дополнительную обработку действий, которая не может быть выполнена в начальном действии контроллера.
Конечно, это не помогает объяснить, почему это сработало при локальном доступе к серверу. Я предполагаю, что это должно быть как-то связано с результатом HttpNotFound.
Комментарии:
1. кажется, что тип страницы может быть значительным. Можете ли вы указать, что именно Index () делает с PageType?
Ответ №1:
Что произойдет, если вы измените вызов на Index
from Discussions
? Если вы используете 1 вместо 2, имеет ли это значение?
public ActionResult Discussions()
{
return Index(1);
}
Комментарии:
1. Похоже, это ничего не меняет, я также попытался передать разные значения в действие Index… снова работает нормально, получая доступ на сервере, но не через Интернет
2. Итак, Guides — единственный, который работает через Интернет? Сбой индексации и обсуждения?
3. Это говорит нам о том, что тип страницы не имеет значения. Это должно сводиться к маршрутизации или чему-то внешнему по отношению к приложению. Каково имя вашего контроллера, и как настроены ваши маршруты, и какой фактический URL вы используете для веб или локального?
4. Я использую тот же URL-адрес для доступа к серверу, что и через Интернет.
5. Отсортировано. Вы никак не могли ответить на это информацией, которую я предоставил, чтобы извиниться за это. 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);
}