2012-04-17 60 views
0

在我的MVC应用程序中,我使用uploadify进行文件上传。控制器的动作是:控制器上的错误处理

[HttpPost] 
public ActionResult Upload(HttpPostedFileBase fileData, FormCollection forms) 
{ 
    try 
    {     
    if (fileData.ContentLength > 0) 
    { 
     var statusCode = Helper.UploadList(); 
     if (statusCode.Equals(System.Net.HttpStatusCode.Created)) 
     return Json(new { success = true });      
    }     
    } 
    return Json(new { success = false });   
} 
catch (Exception ex) 
{  
} 

我设置成功=真/基础上的StatusCode虚假并将它传递给uploadify的onComplete时间(在.js文件),并显示一些有意义的警报。

如果Helper.UploadList()抛出类似的异常:

throw new ArgumentException("Doesn't exist"); 

我怎样才能捕捉到控制器的行动,异常,并最终把它传递给.js文件,这样我可以显示一个错误的用户?

编辑: 如果我设置返回Json(new {success = false});在catch块中,该值不会到达onComplete。

'onComplete': function (event, queueID, fileObj, response, data) { 
       if (response == '{"success":true}') {      
        alert("file uploaded successfully."); 
       } 
       else if (response == '{"success":false}') { 
        alert('file failed to upload. Please try again!');     
       } 
       return false; 
      }, 

    I see this on the UI: 

enter image description here

+0

它看起来像你已经有一个'try/catch'块 - 是问什么特定的JSON响应将uploadify接受显示som ething? – Tejs 2012-04-17 19:33:14

+0

如果我在try/catch中设置成功= false。我如何将它返回给.js? – GoldenUser 2012-04-17 19:36:49

+3

'return Json(new {success = false});'?您仍然可以从catch块返回JSON。 – Tejs 2012-04-17 19:37:16

回答

0

你可以做到这一点聪明一点:

public class ErrorModel{ 
    public bool Success{get;set;} 
    public string Reason{get;set;} 
} 

public JsonResult Upload(HttpPostedFileBase fileData, FormCollection forms) 
{ 
    var model = new ErrorModel { Success = false }; 
    try 
{     
    if (fileData.ContentLength > 0) 
    { 
    var statusCode = Helper.UploadList(); 
    if (statusCode.Equals(System.Net.HttpStatusCode.Created)) 
    model.Reason = "File uploaded: " + filename; 
    model.Success = true; 
    return JSon(model);       
    } else { 
    model.REason = "ERROR: failed to upload file"; 
    return JSon(model); 
    }     
} 

    } 
    catch (Exception ex) 
    { 
model.reason = ex.Message; 
return JSon(model); 
} 

的javascript:

dataTYpe: 'json', 
success: function(data){ 
    if(data.Success){ 
     } else { 
     alert(data.Reason); 
     } 
} 

需要一些额外的工作,你需要做更多的检查你的文件,但您会发现以这种方式返回有意义的结果更容易。

0

你可能会考虑返回一个状态代码

catch(Exception ex) 
{ 
    return new HttpStatusCodeResult(400, "Unexpected error uploading"); 
} 

在你的js

$.ajax({ 
    url: "http://blaa.com/Upload", 
    type: "post", 
    statusCode: { 
     400: function(e) { 
      // do whatever 
     } 
    } 
}); 

的消息可以在e.statusText被发现,但你必须使用IIS或IIS Express来看看它,VS dev服务器不会在调试时发送它 - http://forums.asp.net/post/4180034.aspx