2015-12-02 4 views
3

У меня есть несколько методов в контроллере, которые выглядят как:ASP.NET MVC Обработка исключений с AJAX/JSON

[HttpPost] 
public ActionResult AddEditCommentToInvoice(string invoiceNumber, string comments) 
{ 
    var response = new { success = true, msg = "Comment saved", statusMsg = "Comment saved" }; 

    try 
    { 
     var recordsModified = invoiceService.AddCommentsToInvoice(invoiceNumber, comments); 
     Log.Info(recordsModified ? "Updated Comment" : "Did not update Comment"); 

    } catch (Exception ex) { 
     Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     return Json(new { 
      success = false, 
      msg = "There is missing field data", 
      statusMsg = ex.Message 
     }, JsonRequestBehavior.AllowGet); 
    } 

    return Json(response, JsonRequestBehavior.AllowGet); 
} 

Хотя этот код работает, я не комфортно с этим подходом, потому что:

  1. Try/Задвижки дорогие
  2. код улавливает System.Exception
  3. код некрасиво

Теперь я знаю, что могу использовать OnException или атрибут HandleError.
Я также провел некоторое исследование ELMAH, и это выглядит многообещающим.

Но я все еще хочу вернуть JSON через AJAX моему пользователю, чтобы указать, была ли операция успешной или нет.

Итак, мой вопрос: кто-нибудь использовал любой из трех методов (или, в частности, ELMAH), чтобы вернуть JSON через AJAX?

+0

ELMAH только контролирует и сообщает о необработанных исключениях, он не изменяет поток приложений, подход к атрибутам - ваш лучший выбор. – KiwiPiet

+0

Я делаю то же самое, и я всегда ненавидел его. Я с нетерпением жду решения. Это всегда был один из тех элементов моего «технического долга». – kryptonkal

+0

@ kryptonkal - Я только что наткнулся на это - http://plainoldstan.blogspot.cz/2012/08/mvc-3-elmah-handle-ajaxjson-action.html – coson

ответ

2

Я использую другой подход, подход, который может применяться на уровне контроллера или глобально через GlobalFilters. В моих MVC контроллеров, вы можете переопределить OnActionExecuted метод, и сделать это:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Exception != null) 
     { 
     filterContext.Result = Json(new { success = false }); 
     return; 
     } 

     base.OnActionExecuted(filterContext); 
    } 

Это также может быть сделано как атрибут действия фильтра. Вам не понадобится обработка исключений в ваших контроллерах - если возникает исключение, то это обрабатывается в контексте результата.

Смежные вопросы