我正在与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错误函数正在执行。唯一的问题是我似乎无法在jQuery中收到我的自定义错误消息。
评估e.xmlhttprequest
它具有以下内容:
wenderseText ="尝试获取服务器响应的错误"状态= 500statustext ="错误"
那么,如何将自定义错误消息传达到xmlhttprequest的上述元素之一中?我认为我的控制器上的返回需要以某种方式修改。
解决方案很简单,一旦您看到它,但是上面的文档尚未完成。我们知道我们应该返回一个空字符串以表示成功。我也已经看到 - 但现在找不到 - 建议您可以交替返回JSON对象而不是字符串。Empty。除JSON对象或字符串外,任何其他内容都表示错误。但是我们如何处理呢?
发送到错误事件处理程序的参数仍然具有基本组件:e.files,E.operation和e.xmlhttprequest。解决方案是返回控制器方法中的普通字符串,并成为RAW 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);
};
要处理无效上传,必须更改http返回代码。
在捕获子句中:
HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
sfuqua的答案(谢谢!)澄清并为我工作:
function onError(e) {
var err = e.XMLHttpRequest.responseText;
alert(err);
e.stopPropagation();
return false;
};
在这种情况下,未触发onuploadsuccess()。