Подтвердить что ты не робот

Ошибка 404 ASP.NET MVC 3

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

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

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

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

4b9b3361

Ответ 1

Если вы проверяете ответ с помощью скрипача, я считаю, что вы обнаружите, что пустая страница фактически возвращает код состояния 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 в С# 2010" (Apress) использование customErrors устарело, используя IIS 7. Вместо этого вы должны использовать раздел httpErrors. Вот цитата из книги:

Но хотя этот параметр по-прежнему работает с встроенной тестовой сетью Visual Studios сервер, его фактически заменили секцией <httpErrors> в IIS 7.x.

Ответ 2

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

return new HttpNotFoundResult();

Ответ 4

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

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

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

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

// throwing new exception returns 404 and redirects to the view defined in web.config <customErrors> section
throw new HttpException(404, ExceptionMessages.Error_404_ContentNotFound);

Ответ 5

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

return new HttpStatusCodeResult(404, "My message");