Kendo Upload Control,将自定义错误消息传回查看

Posted

技术标签:

【中文标题】Kendo Upload Control,将自定义错误消息传回查看【英文标题】:Kendo Upload Control, Pass custom error message back to view 【发布时间】:2014-02-20 08:10:25 【问题描述】:

我正在使用 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 的上述元素之一?我认为我的控制器上的返回需要以某种方式进行修改。

【问题讨论】:

【参考方案1】:

解决方法很简单,一看就知道,但是上面的documentation 不完整。我们知道我们应该返回一个空字符串来表示成功。我还看到(但现在找不到)建议您可以交替返回 JSON 对象而不是 string.Empty 的文档,这也意味着成功。 JSON 对象或字符串以外的任何内容。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);
    ;

【讨论】:

我可以通过这种方式显示错误,但控制器仍将其视为有效上传。您知道如何防止默认行为吗? e.preventDefault() 没用。 e.stopPropagation() 可能是正确的回应。但是,我会尝试在自定义错误函数的末尾添加 return false,因为它同时处理 stopPropagation 和 preventDefault。你可以试试两者,看看有什么效果。【参考方案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() 没有被触发。

【讨论】:

以上是关于Kendo Upload Control,将自定义错误消息传回查看的主要内容,如果未能解决你的问题,请参考以下文章

将自定义变量传递给 Formstone

如何将自定义 RESTful 路由添加到 Rails 应用程序?

Kendo UI - 上传按钮 - 自定义

kendo upload必填验证

Kendo Numeric Textbox w。自定义格式 - 不工作

如何使用以前上传的文件填充 Kendo Upload