Возврат 404 Ошибка ASP.NET MVC 3 - PullRequest
30 голосов
/ 12 апреля 2011

Я пробовал следующие 2 вещи, чтобы страница возвращала ошибку 404:

public ActionResult Index()
{
    return new HttpStatusCodeResult(404);
}

public ActionResult NotFound()
{
    return HttpNotFound();
}

, но обе они просто отображают пустую страницу.Как вручную вернуть ошибку 404 из ASP.NET MVC 3?

Ответы [ 5 ]

63 голосов
/ 08 июня 2011

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

Вместо этого можно отобразить фактическое представление, добавив элемент customErrors в ваш web.config, который будет перенаправлять пользователя на определенный URL-адрес, когдавозникает определенный код состояния, который вы затем можете обработать, как если бы вы использовали любой URL.Вот пошаговое руководство ниже:

Сначала выведите HttpException , где это применимо.При создании исключения обязательно используйте одну из перегрузок, которая принимает код состояния http в качестве параметра, как показано ниже.

throw new HttpException(404, "NotFound");

Затем добавьте пользовательский обработчик ошибок в свой файл web.config, чтобы вы моглиопределить, какое представление должно быть отображено при возникновении вышеуказанного исключения.Вот пример ниже:

<configuration>
    <system.web>
        <customErrors mode="On">
          <error statusCode="404" redirect="~/404"/>
        </customErrors>
    </system.web>
</configuration>

Теперь добавьте запись маршрута в ваш Global.asax, который будет обрабатывать URL «404», который передаст запрос действию контроллера, которое отобразит представление для вашего404 стр.

Global.asax

routes.MapRoute(
    "404", 
    "404", 
    new { controller = "Commons", action = "HttpStatus404" }
);

CommonsController

public ActionResult HttpStatus404()
{
    return View();
}

Осталось только добавить представление для вышеуказанного действия.

Одно предостережение с указанным выше методом: согласно книге «Pro ASP.NET 4 в C # 2010» (Apress) использование customErrors устарело, если вы используете IIS 7. Вместо этого вам следует использовать httpErrors раздел.Вот цитата из книги:

Но хотя этот параметр все еще работает со встроенным тестовым веб-сервером Visual Studio, он фактически был заменен разделом <httpErrors> в IIS 7.x.

17 голосов
/ 12 апреля 2011

Я успешно использую это:

return new HttpNotFoundResult();
15 голосов
/ 12 апреля 2011

throw new HttpException(404, "NotFound"); вместе с пользовательским обработчиком ошибок отлично работает для меня.

6 голосов
/ 26 марта 2013

Вы должны использовать

// returns 404 Not Found as EmptyResult() which is suitable for ajax calls
return new HttpNotFoundResult();

когда вы делаете вызовы AJAX своим контроллерам и не находите никакого контента.

Когда вы делаете классические вызовы действий контроллера и возвращаете виды, вы должны использовать:

// throwing new exception returns 404 and redirects to the view defined in web.config <customErrors> section
throw new HttpException(404, ExceptionMessages.Error_404_ContentNotFound);
2 голосов
/ 19 июня 2012

Вы можете персонализировать результат 404 с помощью

return new HttpStatusCodeResult(404, "My message");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...