我正在使用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
时它具有以下内容:
responseText =“尝试获取服务器响应时出错” 状态= 500 StatusText =“错误”
那么如何将我的自定义错误消息发送到XMLHTTPRequest的上述元素之一?我假设我的控制器上的返回需要以某种方式进行修改。
答案 0 :(得分:22)
解决方案很简单,一旦你看到它,但documentation上的问题并不完整。我们知道我们应该返回一个空字符串来表示成功。我也看到了 - 但现在找不到 - 那些建议您可以交替返回JSON对象而不是string.Empty的文档,这也意味着成功。除JSON对象或string.Empty之外的任何内容都表示错误。但是我们如何处理呢?
发送给Error event handler的参数仍然具有基本组件: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);
};
答案 1 :(得分:0)
要作为无效上传处理,必须更改http返回码。
在catch子句中:
HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
答案 2 :(得分:0)
Sfuqua的答案(谢谢!)已经阐明并为我工作:
const branches = executecommand('git branch -l')
在这种情况下,不会触发onUploadSuccess()。