2014-03-30 110 views
1

我试图通过ajax调用来测试Json表示法中的错误。这是我的服务器方法asp.net无法正常返回json错误

 [System.Web.Services.WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public static string publicarError() 
     {    
      try 
      { 
       throw new Exception("error"); 
      } 
      catch (Exception ex) 
      { 
       Dictionary<string, object> error = new Dictionary<string, object>(); 
       error.Add("success", false); 
       error.Add("message", "Something really bad happened"); 
       string output = JsonConvert.SerializeObject(error); 
       return output; 

      } 
     } 

这是我的Ajax调用

$.ajax({ 
       type: "POST", 
       url: pageUrl + '/publicarError', 
       data: '{valor: ' + $('#<%=classroomDropDownList.ClientID%>').val() + '}', 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       success: function() { alert('ok'); }, 
       error: function (xhr, textStatus, exceptionThrown) { 

        var json = xhr.responseText; 
        var result = []; 
        result = eval('(' + json + ')'); 
        var errorMessages = []; 
        //this ugly loop is because List<> is serialized to an object instead of an array 
        for (var key in result) { 
         errorMessages.push(result[key]); 
        } 
        $('#result').html(errorMessages.join("<br />")); 
       }, 

但是当我运行的例子,它总是在更迭功能输入,而不是在错误之一。

我不知道为什么。有什么错误吗?

+0

JQuery只是在寻找一个有效的响应。您的方法将返回有效的JSON作为Exception的一部分,并且不会更改HttpStatus,因此JQuery不会了解其中的差异。如果您在ajax调用中从成功(result)函数内部提示JSON.Stringify(result),您可能会得到错误对象。 – nixkuroi

+0

它是一个很好的观点,我会尝试看看警报。 HttpStatusCode我不能改变,因为该方法是静态的。所以我不知道如何在静态方法中访问Context.Response.StatusCode –

回答

2

这是正常的行为。你没有返回错误,你正在返回一个有效的JSON对象,所以它转到success函数。要去error函数,你需要抛出一个异常。注释掉try ... catchthrow new Exception("error");将转到error函数。

+0

但是当我这样做时,Visual Studio中会出现未处理的异常消息。它好吗?或者我不得不把另一个尝试并捕获到某处 –

+0

@emmanuelsio你的意思是在调试模式?没错,没关系。只要你只用Ajax调用这个方法即可。如果您通过其他一些C#代码调用'publicarError()'函数,则可以在其中用'try ... catch'环绕它。 –

+0

它可以解决您的问题。我不太喜欢让碰撞引发新的异常,而没有人捕捉到。这是一个很好的做法吗? –