How to make custom error pages work in ASP.NET MVC 4

前端 未结 11 2224
陌清茗
陌清茗 2020-11-22 12:25

I want a custom error page shown for 500, 404 and 403. Here\'s what I have done:

  1. Enabled custom errors in the web.config as follows:

    
    
            
11条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-22 13:05

    Here is my solution. Use [ExportModelStateToTempData] / [ImportModelStateFromTempData] is uncomfortable in my opinion.

    ~/Views/Home/Error.cshtml:

    @{
        ViewBag.Title = "Error";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    

    Error


    @Html.ValidationMessage("Error")

    ~/Controllers/HomeController.sc:

    public class HomeController : BaseController
    {
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Error()
        {
            return this.View();
        }
    
        ...
    }
    

    ~/Controllers/BaseController.sc:

    public class BaseController : Controller
    {
        public BaseController() { }
    
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Result is ViewResult)
            {
                if (filterContext.Controller.TempData.ContainsKey("Error"))
                {
                    var modelState = filterContext.Controller.TempData["Error"] as ModelState;
                    filterContext.Controller.ViewData.ModelState.Merge(new ModelStateDictionary() { new KeyValuePair("Error", modelState) });
                    filterContext.Controller.TempData.Remove("Error");
                }
            }
            if ((filterContext.Result is RedirectResult) || (filterContext.Result is RedirectToRouteResult))
            {
                if (filterContext.Controller.ViewData.ModelState.ContainsKey("Error"))
                {
                    filterContext.Controller.TempData["Error"] = filterContext.Controller.ViewData.ModelState["Error"];
                }
            }
    
            base.OnActionExecuted(filterContext);
        }
    }
    

    ~/Controllers/MyController.sc:

    public class MyController : BaseController
    {
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Details(int id)
        {
            if (id != 5)
            {
                ModelState.AddModelError("Error", "Specified row does not exist.");
                return RedirectToAction("Error", "Home");
            }
            else
            {
                return View("Specified row exists.");
            }
        }
    }
    

    I wish you successful projects ;-)

提交回复
热议问题