Создайте пользовательскую ошибку, когда она возвращает 404 в ASP.NET MVC

Я попытался найти и нашел какое-то решение. Я пробовал, но не повезло. Большинство принятых решений - настроить файл Web.config. Я попробовал, но все равно возвращает страницу ошибки по умолчанию.

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

любой другой способ, как настроить его?

Я не хочу настраивать его в IIS


person FrostyPinky    schedule 06.09.2016    source источник


Ответы (1)


Это решение не требует изменений в файле web.config или обходных маршрутов.

Сначала создайте такой контроллер;

public class ErrorController : Controller
{
public ActionResult Index()
{
    ViewBag.Title = "Regular Error";
    return View();
}

public ActionResult NotFound404()
{
    ViewBag.Title = "Error 404 - File not Found";
    return View("Index");
}
}

Затем создайте представление в разделе «Views/Error/Index.cshtml» как;

 @{
  Layout = "~/Views/Shared/_Layout.cshtml";
 }                     
<p>We're sorry, page you're looking for is, sadly, not here.</p>

Затем добавьте следующее в файл Global asax, как показано ниже:

protected void Application_Error(object sender, EventArgs e)
    {
    // Do whatever you want to do with the error

    //Show the custom error page...
    Server.ClearError(); 
    var routeData = new RouteData();
    routeData.Values["controller"] = "Error";

    if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
    {
        routeData.Values["action"] = "Index";
    }
    else
    {
        // Handle 404 error and response code
        Response.StatusCode = 404;
        routeData.Values["action"] = "NotFound404";
    } 
    Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
    IController errorsController = new ErrorController();
    HttpContextWrapper wrapper = new HttpContextWrapper(Context);
    var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
    errorsController.Execute(rc);
 }

Если после этого вы по-прежнему получаете настраиваемую страницу ошибки IIS, убедитесь, что следующие разделы закомментированы (или пусты) в файле веб-конфигурации:

   <system.web>
    <customErrors mode="Off" />
   </system.web>
   <system.webServer>   
    <httpErrors>     
    </httpErrors>
   </system.webServer>
person user3378165    schedule 06.09.2016
comment
Привет! Я попробовал то, что вы предлагаете. Это работает, но теперь моя проблема заключается в том, что код в _Layout.cshtml был помещен в <pre> </pre> - person FrostyPinky; 06.09.2016
comment
Вместо routeData, который вы использовали, я использовал Response.Redirect("~/Error/Index");, и он работает. Спасибо - person FrostyPinky; 06.09.2016
comment
@FrostyPinky Пожалуйста, рад, что смог помочь :) - person user3378165; 06.09.2016