Как вернуть результат JSON из пользовательского фильтра исключений? - PullRequest
8 голосов
/ 05 марта 2011

Я хотел бы создать пользовательский фильтр исключений, который будет перехватывать исключения, генерируемые в действиях контроллера, которые возвращают результаты JSON.

Я бы хотел провести рефакторинг следующего метода действия:

        public JsonResult ShowContent()
    {
        try
        {
            // Do some business logic work that might throw a business logic exception ...
            //throw new ApplicationException("this is a business exception");

            var viewModel = new DialogModel
                                {
                                    FirstName = "John",
                                    LastName = "Doe"
                                };

            // Other exceptions that might happen:
            //throw new SqlException(...);
            //throw new OtherException(...);
            //throw new ArgumentException("this is an unhandeled exception");

            return
                Json(
                    new
                        {
                            Status = DialogResultStatusEnum.Success.ToString(),
                            Page = this.RenderPartialViewToString("ShowContent", viewModel)
                        });
        }
        catch (ApplicationException exception)
        {
            return Json(new { Status = DialogResultStatusEnum.Error.ToString(), Page = exception.Message });
        }
        catch (Exception exception)
        {
            return Json(new { Status = DialogResultStatusEnum.Exception.ToString(), Page = "<h2>PROBLEM!</h2>" });
        }
    }
}

Я хотел бы создать атрибут фильтра пользовательских исключений, который будет перехватывать любые исключения, возникающие в действии, в соответствии со следующей логикой:

  1. Проверьте, не было ли исключения
    • Нет: возврат
    • да:
      • Если исключение BusinessLogic - вернуть результат JSON
      • Если другое необработанное исключение:
        • Вход
        • Вернуть другой результат JSON с другим кодом результата

Ответы [ 2 ]

19 голосов
/ 08 июля 2012

Я нашел возможным решить эту проблему, используя код, найденный в этой статье (с небольшими изменениями.)

public class HandleJsonExceptionAttribute : ActionFilterAttribute
{
    #region Instance Methods

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
        {
            filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
            filterContext.Result = new JsonResult()
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new
                {
                    Error = filterContext.Exception.Message
                }
            };
            filterContext.ExceptionHandled = true;
        }
    }

    #endregion
}
0 голосов
/ 05 марта 2011
  public class YourController : BaseController
    {
        public JsonResult showcontent()
        {
            // your logic here to return foo json
            return Json ( new { "dfd" }); // just a dummy return text replace it wil your code
        }
    }

    public class BaseController : Controller
    {
 // Catch block for all exceptions in your controller
        protected override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            if (filterContext.Exception.Equals(typeof(ApplicationException)))
            {
                //do  json and return
            }
            else
            {
                // non applictaion exception
// redirect to generic error controllor and error action which will return json result

            }
        }

    }

Перейдите по этой ссылке, чтобы узнать, как создать и использовать атрибут HandleError

* РЕДАКТИРОВАТЬ для HandleAttribute для действий *

//not tested code
public class HandleErrorfilter : HandleErrorAttribute
    {
         public string ErrorMessage { get; set; }

        public override void OnException(ExceptionContext filterContext)
        {
                string message = string.Empty;
                //if application exception
                // do  something
                 else
                    message = "An error occured while attemting to perform the last action.  Sorry for the inconvenience.";
            }
            else
            {
                base.OnException(filterContext);
            }
        }

      public class YourController : BaseController
        {
            [HandleErrorfilter]
            public JsonResult showcontent()
            {
                // your logic here to return foo json
                return Json ( new { "dfd" }); // just a dummy return text replace it wil your code
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...