Kendo Upload Control, передать пользовательское сообщение об ошибке для просмотра

Я работаю с ASP.NET MVC3, Kendo UI и JQuery. Я пытаюсь передать сообщение об ошибке обратно в представление, когда обработка загруженного файла не проходит правила проверки, которые у нас есть.

Вот мой контроль над загрузкой на мой взгляд:

@(Html.Kendo().Upload()
  .Name("files")
  .Async(a => a
  .Save("SaveForm", "Home")
  .Remove("RemoveForm", "Home")
  .AutoUpload(true))
  .Events(events => events
  .Success("onSuccess")
  .Error("onUploadError")
  .Select("onSelect")
  ))

Вот соответствующие части метода SaveForm в контроллере:

try
{
      FieldDefinitions = ProcessPDFFile(file.FileName);
}
catch (InvalidDataException ex){
    List<String> errors = new List<String>();
    errors.Add(ex.Message);
    Response.StatusCode = 500;
    Response.TrySkipIisCustomErrors = true;

    //return Json(new { success = false, statusText = "error error" }, "text/plain");
    //ModelState.AddModelError("pp", ex.Message);
    //var result = ModelState.ToDataSourceResult();
    //return Json(errors, JsonRequestBehavior.AllowGet);
    //return Json(new { status = "OK" }, "text/plain");
    //return Json(String.Concat(errors.ToArray()));
    //return Json(new AjaxResult(false, ex.Message, errors ));
}

Вот моя функция ошибки JQuery:

function onUploadError(e)
{
    alert(e.message);
}

В моем контроллере ex.Message является настраиваемым сообщением об ошибке, и я хочу передать его обратно в представление для отображения. Вы можете увидеть все различные варианты, которые я пытался передать, просмотрев прокомментированные строки кода в моем контроллере.

Выполняется выполнение функции jquery error. Единственная проблема заключается в том, что я не могу получить свое пользовательское сообщение об ошибке в jquery.

При оценке e.XMLHTTPRequest

он имеет следующее:

responseText = "Ошибка при попытке получить ответ сервера" Статус = 500 StatusText = "error"

Итак, как мне получить свое сообщение об ошибке в один из вышеперечисленных элементов XMLHTTPRequest? Я предполагаю, что возврат на моем контроллере должен быть каким-то образом изменен.

Ответ 1

Решение прост, как только вы его видите, но документация по этому вопросу не завершена. Мы знаем, что мы должны вернуть пустую строку, чтобы обозначить успех. Я также видел - но не могу найти прямо сейчас - документы, которые предполагают, что вы можете поочередно возвращать объект JSON вместо string.Empty, и это тоже означало бы успех. Все, кроме объекта JSON или string.Empty означает ошибку. Но как мы справляемся с этим?

Аргумент, посланный обработчику событий ошибки, по-прежнему содержит основные компоненты: e.files, e.operation и e.XMLHttpRequest. Решение состоит в том, чтобы вернуть нормальную строку в ваш метод контроллеров, и она станет необработанным XMLHttpRequest.responseText. Это не JSON, поэтому не пытайтесь разбирать JSON.

Контроллер:

    public ActionResult Index(IEnumerable<HttpPostedFileBase> files)
    {
        try
        {
            // … do something
            return Content(string.Empty);
        }
        catch (Exception ex)
        {
            // simply send the error message to Content
            return Content(ex.Message);
        }
    }

Обработчик JavaScript:

    function onError(e) {
        // invalid because the responseText is a raw string, not JSON
        //var err = $.parseJSON(e.XMLHttpRequest.responseText);
        var err = e.XMLHttpRequest.responseText;
        alert(err);
    };

Ответ 2

Чтобы обрабатывать как недопустимую загрузку, пришлось изменить код возврата http.

В разделе catch:

HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

Ответ 3

Sfuqua ответ (спасибо!) Уточнил и работает на меня:

function onError(e) {
    var err = e.XMLHttpRequest.responseText;
    alert(err); 
    e.stopPropagation();
    return false;
};

В этом случае onUploadSuccess() не был запущен.