查看我的filterContext.Result时,什么都不会发生。

7 浏览
0 Comments

查看我的filterContext.Result时,什么都不会发生。

我有一个自定义的异常,在某些情况下会被抛出。当它被抛出时,我想渲染一个特定的视图并输出到响应中。

在开始之前,是的,我在根级Web.config中有

我正在几乎完全按照Darin在这个答案中建议的方式进行操作:

public class EntityNotFoundHandleErrorAttribute : HandleErrorAttribute {
    public override void OnException(ExceptionContext filterContext) {
        if (!filterContext.IsChildAction && !filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled && filterContext.Exception is EntityNotFoundException) {
            string controllerName = (string)filterContext.RouteData.Values["controller"];
            string actionName = (string)filterContext.RouteData.Values["action"];
            HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
            ViewResult result = new ViewResult {
                ViewName = this.View,
                ViewData = new ViewDataDictionary(model),
                TempData = filterContext.Controller.TempData
            };
            filterContext.Result = result;
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
    }
}

并在FilterConfig.cs中进行注册(从Global.asax调用):

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new EntityNotFoundHandleErrorAttribute() {
            ExceptionType = typeof(Inspect.Models.EntityNotFoundException),
            View = "NotFound",
            Order = 2
    });
    // 注释掉只是为了确保这不会搞砸。
    // filters.Add(new Utilities.ElmahHandleErrorAttribute(), 1);
}

问题是,我可以确认OnException按预期运行,但视图不显示。相反,我得到的是一个不太有用的黄色死亡屏幕,告诉我如果想看到细节,应该使用customErrors="RemoteOnly"

最让人气馁的是,如果我将filterContext.Result更改为RedirectResult,所有这些东西都能正常工作。但我不想这样做。我只想将视图写入响应中。

0
0 Comments

问题的出现原因是在代码中使用了this.View的值为"NotFound",而这个值不能正常工作。通过将this.View的值更改为"~/Views/Errors/NotFound"可以解决该问题。

0