Ошибка HTTP 404.0 — не найдено в MVC 5

Мой проект в MVC 5. я хотел обработать 404. я сделал это, но проблема в том, что

Когда я получаю доступ к представлению, используя следующий URL-адрес, все работает нормально и, как и ожидалось:

http://localhost/Hotels/Index30701000000

Но когда я получаю доступ к представлению, используя следующий URL-адрес, я получаю сообщение об ошибке 404.0 (ошибка показана ниже)

http://localhost/Hotels/Edit/09099999dfdfb                       
http://localhost/Hotels/Edit/090/20130701000000

Ошибка: Ошибка HTTP 404.0 — не найден Ресурс, который вы ищете, был удален, его имя было изменено или он временно недоступен.

Мой код

Контроллер

public class ErrorController : Controller
{
    // GET: Error
    public ActionResult Unauthorized()
    {
        Response.StatusCode = 404;
        Response.TrySkipIisCustomErrors = true;
        return View();
    }
}

Конфигурация маршрута

    routes.MapRoute(
        name: "Unauthorized",
        url: "Unauthorized/{action}/{id}",
        defaults: new
        {
            controller = "Error",
            action = "Unauthorized",
            id = UrlParameter.Optional
        }
    );

Global.asax

    protected void Application_Error()
    {
        Exception exception = Server.GetLastError();
        HttpException httpException = exception as HttpException;
    }

веб-конфиг

  <system.web>
    <customErrors mode="On" defaultRedirect="Error">
      <error statusCode="404" redirect="Unauthorized" />
    </customErrors>
  </system.web>

Просмотр //Unauthorized.cshtml

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = "Unauthorized";
}
<h1>Page Not Found!</h1>

Справочная ссылка


person ANJYR    schedule 19.11.2014    source источник
comment
Я не знаю, как это сделать в C#, но почему бы вам не изменить настройки сервера, чтобы он перенаправлял каждый 404 на вашу пользовательскую страницу?   -  person GuyT    schedule 19.11.2014
comment
я не знаю, как это сделать,   -  person ANJYR    schedule 19.11.2014


Ответы (2)


просто напишите эти строки кода в файле global.asax вашего приложения.

protected void Application_EndRequest()
    {
        if (Context.Response.StatusCode == 404)
        {
            if ((!Request.RawUrl.Contains("style")) && (!Request.RawUrl.Contains("images")))
            {
                Response.Clear();
                if (Response.StatusCode == 404)
                {
                    Response.Redirect("/ControllerName/ActionName");
                }
            }
        }
    }
person DOTNET Team    schedule 19.11.2014

Другой подход заключается в том, чтобы определить ваши страницы ошибок в ErrorController, а затем использовать раздел httpError в system.WebServer в вашем файле web.config.

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Error/Error" />
</httpErrors>

Приведенный выше код предназначен для того, чтобы вы могли протестировать свою пользовательскую страницу. Но в вашей среде разработки вы можете заменить Custom на errorMode="DetailedLocalOnly" и existsResponse="Auto", чтобы по-прежнему видеть подробные сведения об ошибках.

Недавно я написал об этом пост, и он поставляется с демонстрационным проектом, доступным на GitHub, с которым вы можете поиграть. http://www.neptuneescence.com/Blogs/ASP-NET/MVC5/MVC-5-How-To-Show-Custom-Error-Pages

person Eric    schedule 29.11.2014