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() не был запущен.