404 страницы в ASP.NET MVC - PullRequest
5 голосов
/ 04 апреля 2010

Я создаю свой первый веб-сайт ASP.NET MVC и пытаюсь понять, как реализовать страницу 404.

Должен ли я создать контроллер с именем "404Controller?" Если да, то как мне зарегистрировать этот контроллер в IIS, чтобы он перенаправлял 404 на эту страницу? Кроме того, в ситуации, когда что-то не найдено (например, в базе данных) каким-либо другим кодом контроллера, как мне перенаправить запрос на страницу 404?

Ответы [ 6 ]

14 голосов
/ 04 апреля 2010

Нет единого ответа на то, что вы пытаетесь сделать, самое простое и что мне нравится, это использовать класс HttpException, например,

public ActionResult ProductDetails(int id) {

   Product p = this.repository.GetProductById(id);

   if (p == null) {
      throw new HttpException(404, "Not Found");
   }

   return View(p);
}

В web.config вы можете настраивать страницы customError, например,

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite">
   <error statusCode="404" redirect="Views/Errors/Http404.aspx" />
</customErrors>
7 голосов
/ 04 апреля 2010

Любимый вариант для меня - вернуть представление с именем 404.

if (article == null)
    return View("404");

Это позволит вам иметь общее представление 404 в общей папке и специальное представление 404 для контроллера статей.

Кроме того, большим плюсом является то, что здесь нет перенаправления.

4 голосов
/ 11 ноября 2010

MVC 3 включает класс HttpNotFoundResult, а Controller также имеет HttpNotFound статический метод.

    public ActionResult Index(int id) {
        var myThing = Loader.GetById(id);
        if (myThing == null) {
            return HttpNotFound("Thing Not Found");
        }
        return View(myThing);
    }
0 голосов
/ 25 июня 2013

В случае, если это поможет кому-то в будущем ...

По аналогии с ответом Фитцхака, у меня есть пользовательский вид 404 в моей общей папке. Чтобы вернуть правильный код состояния, я просто добавил это в начало этого представления

@{
    ViewBag.Title = "Page Not Found";
    Response.StatusCode = 404;
}

прекрасно работал на моем локальном хосте, но на моем производственном сервере мне пришлось добавить эту строку в веб-конфигурацию, потому что IIS перехватывал статус 404 и создавал свою собственную страницу 404.

<system.webServer>
    ...
    <httpErrors errorMode="Detailed" />
</system.webServer>
0 голосов
/ 25 августа 2012

Добавьте Application_EndRequest метод к вашему MvcApplication за Marco's Better-Than-Unicorns MVC 404 Answer . Чтобы вызвать ошибку «not found» в вашем коде, бросьте new HttpException(404, "Not Found").

0 голосов
/ 04 апреля 2010
  1. Вы правы, создайте NotFoundController и сопоставьте маршрут к нему, скажем /404, а затем вставьте URL в ваш web.config файл (см. @ R0MANARMY) ответ.

  2. Вы можете просто throw new HttpException(404, "Not Found") или, если вы не хотите выбрасывать исключения (что дорого), вы можете просто установить код состояния на 404 через свойство Response.StatusCode, а затем вернуть View("My404Template") из вашего методы действия.

...