Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I show Exception message in shared view Error.cshtml?

If I start with a new MVC 5 project, in web.config setting customErrors mode="on" allows the shared view 'Error.cshtml' to show when I force (raise) an exception, but it only shows the following text...

Error.

An error occurred while processing your request.

How do I pass information to this view to display more relevant info, such as what error occurred? Can I use this view if I use the Global.asax method...

protected void Application_Error()

?

like image 500
barrypicker Avatar asked Jul 15 '15 21:07

barrypicker


1 Answers

Override the filter:

// In your App_Start folder
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ErrorFilter());
        filters.Add(new HandleErrorAttribute());
        filters.Add(new SessionFilter());
    }
}

// In your filters folder (create this)
public class ErrorFilter : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(System.Web.Mvc.ExceptionContext filterContext)
    {
        System.Exception exception = filterContext.Exception;
        string controller = filterContext.RouteData.Values["controller"].ToString();;
        string action = filterContext.RouteData.Values["action"].ToString();

        if (filterContext.ExceptionHandled)
        {
            return;
        }
        else
        {
            // Determine the return type of the action
            string actionName = filterContext.RouteData.Values["action"].ToString();
            Type controllerType = filterContext.Controller.GetType();
            var method = controllerType.GetMethod(actionName);
            var returnType = method.ReturnType;

            // If the action that generated the exception returns JSON
            if (returnType.Equals(typeof(JsonResult)))
            {
                filterContext.Result = new JsonResult()
                {
                    Data = "DATA not returned"
                };
            }

            // If the action that generated the exception returns a view
            if (returnType.Equals(typeof(ActionResult))
                || (returnType).IsSubclassOf(typeof(ActionResult)))
            {
                filterContext.Result = new ViewResult
                {
                    ViewName = "Error"
                };
            }
        }

        // Make sure that we mark the exception as handled
        filterContext.ExceptionHandled = true;
    }
}

Declare the model at the top of the 'error' view:

@model System.Web.Mvc.HandleErrorInfo

Then use on the page like so:

@if (Model != null)
{
    <div>
        @Model.Exception.Message
        <br />
        @Model.ControllerName
    </div>
}

Hope this helps.

like image 99
Denys Avatar answered Oct 14 '22 05:10

Denys