none
MVC 全局异常 如何获得ActionDescriptor RRS feed

  • 问题

  • 我定义了一个类

        public class ErrorAttribute : HandleErrorAttribute
        {

            //写日志对象
            private static ILog log = LogManager.GetLogger(typeof(ErrorAttribute));

            public override void OnException(ExceptionContext filterContext)
            {
                //获取异常信息,入库保存
                Exception Error = filterContext.Exception;
                string Message = Error.Message;//错误信息
                string Url = HttpContext.Current.Request.RawUrl;//错误发生地址
                log.Error(。。。);
               

                if (filterContext.HttpContext.Request.Headers["X-Requested-With"].ToLower() == "xmlhttprequest")
                {
                    filterContext.Result = CommonHelper.RedirectErrWithAjax("~/DataEntryErr/Error404");
                }
                else
                {
                    filterContext.Result = new RedirectResult("~/DataEntryErr/Error404");//跳转至错误提示页面
                }
                filterContext.ExceptionHandled = true;

                base.OnException(filterContext);
            }
        }

    请问在OnException方法中我如何通过ExceptionContext filterContext  这个参数取得ActionDescriptor

    因为我想通过ActionDescriptor来判断我的Action是否定义了某个特性,

            public static ActionResult Redirect(string url, ActionDescriptor action)
            {
                //如果Ajax请求没有权限,就返回 Json消息
                if (action.IsDefined(typeof(AjaxRequestAttribute), false)
                || action.ControllerDescriptor.IsDefined(typeof(AjaxRequestAttribute), false))
                {
                    return RedirectAjax("nologin", "您没有登陆或没有权限访问此页面~~", url,null);
                }
                else//如果 超链接或表单 没有权限访问,则返回 302重定向命令
                {
                    return new RedirectResult(url);
               

    2014年11月19日 0:39

答案

  • 你好:

    请参考以下代码:

    public class ErrorAttribute : HandleErrorAttribute
        {
    
            public override void OnException(ExceptionContext filterContext)
            {
                var controllerType = filterContext.Controller.GetType();
                var controllerContext = filterContext.Controller.ControllerContext;
                var actionName = filterContext.RouteData.Values["action"].ToString();
    
                var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
                var actionDescriptor=controllerDescriptor.FindAction(controllerContext, actionName);
    
                base.OnException(filterContext);
            }
        }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 limin2015 2014年11月20日 7:17
    2014年11月19日 6:11
    版主

全部回复

  • 你好:

    请参考以下代码:

    public class ErrorAttribute : HandleErrorAttribute
        {
    
            public override void OnException(ExceptionContext filterContext)
            {
                var controllerType = filterContext.Controller.GetType();
                var controllerContext = filterContext.Controller.ControllerContext;
                var actionName = filterContext.RouteData.Values["action"].ToString();
    
                var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
                var actionDescriptor=controllerDescriptor.FindAction(controllerContext, actionName);
    
                base.OnException(filterContext);
            }
        }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 limin2015 2014年11月20日 7:17
    2014年11月19日 6:11
    版主
  • 谢谢你的回答,问题得到解决,非常感谢

    2014年11月20日 7:15