2012-03-02 3 views
1

Схожие вопросы задавались снова и снова, но по какой-то причине ни одна из вещей, которые я пробовал, не сработала. У меня есть приложение AJAX и когда запрос пользователя недействительный URL Я хотел бы вернуть JsonResult, который выглядит примерно так:ASP.NET MVC Json 404 Response

[ error: true, status: 404, message: 'The requested page could not be found... or some other message... '] 

Я не хочу, чтобы пользователь просто перенаправляется на страницу ошибки, определенной в файл web.config, поскольку это выведет их из приложения ajax.

Я попытался следующие вещи:

  • Пользовательские HandleErrorAttribute - Оказывается, это только обрабатывать 500 ошибок, связанных с исключениями брошенные мой код
  • Пользовательские FilterAttribute, который расширяет FilterAttribute и реализует IExceptionFilter - такой же вопрос, как и раньше
  • Override HandleUnknownAction в базовом контроллере - не удалось выяснить, как вернуть JsonResult из метода
  • Добавлен улов всех маршрутов - Мои другие маршруты используются до того, как поймать ll route найдено

Любые мысли были бы ценными.

+0

Как можно использовать другие ваши маршруты, если вы это ожидаете? – Lazarus

+0

URL-адрес/NonExistantController/NonExistantAction/по-прежнему соответствует маршруту запаса/{Контроллер}/{Действие}/{id}, так что маршрут используется до того, как весь маршрут {* url} –

ответ

2

• Override HandleUnknownAction в базовом контроллере - Не могу понять, как вернуть JsonResult от метода

new JsonResult() 
    { 
    Data = your_404_data, 
    JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
    }.ExecuteResult(ControllerContext); 

Обновлено включить JsonRequestBehavior - что вам нужно.

Для запросов, которые не соответствуют существующему контроллеру или ресурсу, у вас есть два варианта: отбросить стандартный маршрут общего доступа "{controller}/{action}/{id}" и заменить его на тот, который отправляет запрос на фиксированный контроллер, который возвращает этот 404-подобный ответ что ты хочешь.

Или используйте стандартную обработку ошибок Asp.Net для перенаправления на маршрут, который будет делать то же самое. Лично я предпочитаю это решение, потому что это означает, что вам не нужно кодировать множество маршрутов в ваш глобальный.

+0

Отлично работает. Как насчет неизвестного контроллера? –

+0

@ NickOlsen - обновил мой ответ; в основном, либо канат по умолчанию для 404 catch-all; или использовать ответы об ошибках Asp.Net для перенаправления на контроллер, который возвращает этот ответ. Если это IIS 7, и я уверен, что это так, вы также можете использовать собственные ошибки IIS в web.config, чтобы сделать то же самое. –

0

Вы можете дать https://github.com/Buildstarted/Errlusion вихрь и создать любую обработку, которую вы хотите для 404. Возможно, вы можете вернуть специальное сообщение ajax, если это запрос ajax или вернуть html, если это стандартный запрос веб-браузера, если хотите.