Возврат пользовательской ошибки от контроллера mvc к вызову jquery ajax

Я пытаюсь передать пользовательскую ошибку из контроллера asp.net mvc4 в вызов jquery.ajax (). Итак, я написал собственный фильтр ошибок:

public class FormatExceptionAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new JsonResult()
            {
                ContentType = "application/json",
                Data = new
                {
                    name = filterContext.Exception.GetType().Name,
                    message = filterContext.Exception.Message,
                    callstack = filterContext.Exception.StackTrace
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
        else
        {
            base.OnException(filterContext);
        }
    }
 }

И я зарегистрировал его как глобальный фильтр, выполнив:

GlobalFilters.Filters.Add(new FormatExceptionAttribute());

Ниже моего вызова ajax, определенного в моем представлении mvc4 (обратите внимание, что задача представляет собой строку типа "/ MyController / MyAction /»):

 function loadData(task) {
     ajax({
         url: task,
         type: 'POST',
         dataType: 'json',
         contentType: "application/json; charset=utf-8"
     }).then(function (data) {
         $(data).map(function (i, item) {
             addNewElement(item);
         })
     },
             function (xhr) {
                 try {
                     // a try/catch is recommended as the error handler
                     // could occur in many events and there might not be
                     // a JSON response from the server
                     var json = $.parseJSON(xhr.responseText);
                     alert(json.errorMessage);
                 } catch (e) {
                     alert('something bad happened');
                 }
             });
 };

Таким образом, MyAction в Mycontroller выглядит следующим образом:

    [HttpPost]
    public ActionResult MyAction()
    {
        try
        {
            var dataCollection = (dynamic)null;

            using (ConfigContext context = new ConfigContext())
            {
                dataCollection = context.MyItems.Where(i=> i.TypeId == 1).AsEnumerable().OrderBy(k => k.Name).Select(w => new
                    {
                        Alias = string.Format("{0}-{1}", Resources.Constants.Prefix, w.Id),
                        Name = w.Name,
                        Desc = w.Desc
                    }).ToArray();
            }

            return Json(dataCollection);
        }
        catch (Exception ex)
        {

            // I want to return ex.Message to the jquery.ajax() call
            JsonResult jsonOutput = Json(
             new
             {
                 reply = new
                 {
                     status = "Failed in MyAction.",
                     message = "Error: " + ex.Message
                 }
             });

            return jsonOutput;
        }
    }

По какой-то причине в вызове jquery.ajax () я не получаю ошибку ex.message, отправленную контроллером (на стороне сервера), и в jquery.ajax () при попытке преобразовать в json с помощью:

var json = $.parseJSON(xhr.responseText);

генерируется исключение, говорящее, что это не результат json, поэтому jquery.ajax вводит в теле catch:

 } catch (e) {
     alert('something bad happened');
 }

Итак, что я хотел бы сделать, это:

Возврат ex.message из контроллера в вызов jquery.ajax ().Кроме того (приятно иметь), вместо того чтобы регистрировать пользовательский фильтр ошибок, указанный выше как глобальный фильтр в global.asax.cs, я хотел бы применить его только к тем конкретным контроллерам / действиям, которые вызываются вызовами ajax.Также (возможно, было бы лучше открыть другой поток), конкатенация строк (String.format) в MyAction в контроллере вызывает исключение, когда я развертываю / публикую свое веб-приложение как приложение на веб-сайте по умолчанию на IIS, но, тем не менее, это работает нормально (без каких-либо ошибок) при развертывании его в качестве отдельного веб-сайта. Я использую SQL Server Compact Edition SQLCe встроенный. Насколько я знаю, он не поддерживает конкатенацию, но я решил это, применив AsEnumerable (). Он работает при развертывании веб-приложения как отдельного веб-сайта, но не работает при развертывании его в качестве приложения на веб-сайте по умолчанию. Есть идеи здесь?

Ответы на вопрос(1)

Ваш ответ на вопрос