Вариант первый:
- создание контроллера ошибок с представлением «NotFound» вместе с представлением «Unknown». Это займет все, что является ошибкой 500 Server или 404 NotFound, и перенаправит вас на соответствующий URL. Мне не очень нравится это решение, поскольку посетитель всегда перенаправляется на страницу с ошибкой.
http://example.com/Error/Unknown
<customErrors mode="On" defaultRedirect="Error/Unknown">
<error statusCode="404" redirect="Error/NotFound" />
<error statusCode="500" redirect="Error/Unknown" />
</customErrors>
- Wwwroot /
- Контроллеры
- Просмотров /
- Ошибка /
- NotFound.aspx
- Unknown.aspx
Вариант второй:
I Определенно не предпочитают этот метод (поскольку он в основном возвращается к веб-формам, второй вариант - просто иметь статическую страницу Error.aspx и игнорировать маршрут в MVC), но это работает, тем не менее. Здесь вы игнорируете «Статический» каталог, размещаете там страницы с вашими физическими ошибками и обходите MVC.
routes.IgnoreRoute("/Static/{*pathInfo}"); //This will ignore everything in the "Static" directory
- Wwwroot /
- Контроллеры /
- Статический /
- Views /
Вариант третий:
Третий вариант ( ЭТО МОЙ ЛЮБИМЫЙ ) - возвращать представление ошибок из любого представления, в котором обнаружена ошибка. Это потребует от вас кодирования блоков Try / Catch по пути «известных» ошибок, а затем вы можете использовать HandleError для неизвестных ошибок, которые могут появиться. Для этого нужно сохранить первоначально запрошенный URL-адрес, но вернуть представление ERROR.
Пример:
http://example.com/Products/1234 покажет страницу сведений для ProductID 1234
http://example.com/Products/9999 отобразит страницу ошибки NotFound , поскольку ProductID 9999 не существует
http://example.com/Errors/NotFound «следует» никогда не показывать, потому что вы обрабатываете эти ошибки индивидуально в своих контроллерах.
Web.Config
<customErrors mode="On">
</customErrors>
Контроллер
// Use as many or as few of these as you need
[HandleError(ExceptionType = typeof(SqlException), View = "SqlError")]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "NullError")]
[HandleError(ExceptionType = typeof(SecurityException), View = "SecurityError")]
[HandleError(ExceptionType = typeof(ResourceNotFoundException), View = "NotFound")]
Public Class ProductController: Controller{
public ViewResult Item(string itemID)
{
try
{
Item item = ItemRepository.GetItem(itemID);
return View(item);
}
catch()
{
return View("NotFound");
}
}
}
Структура папок
- Wwwroot /
- Контроллеры /
- Общий /
- NotFound.aspx
- NullError.aspx
- SecurityError.aspx
- SqlError.aspx
- Views /
Вариант четвертый:
Последним вариантом будет то, что вы создадите свой собственный фильтр для таких вещей, как ResourceNotFoundException
и присоедините его к своему классу контроллера. Это будет делать то же самое, что и выше, но с дополнительным преимуществом отправки кода ошибки также клиенту.
Ричард Дингвол говорит об этом в своем блоге .