2016-06-14 72 views
0

我正在研究一个基本的ASP.NET & AJAX/JSON任务,我很沮丧地使它工作。其中一个要求是创建一个AJAX/JSON方法来对SQL DB数据进行一些操作。尽管200 OK状态,为什么AJAX JSON响应失败?

为了完成这一点,我用下面的代码:

在ASPX:

$.ajax({ 
       type: "GET", 
       dataType: "json", 
       url: "Retrieve",  
       success: function (data) { 
        alert(data); 
        var col; 
        for (col in data) { 
         alert(col); 
         addRow(data[col].id, data[col].Name, data[col].catagory, data[col].difficulty, data[col].company, data[col].price, '#products'); 
        } 
       }, 
       error: function() { 
        alert("1"); 

       } 

在“retrieve.aspx”页面(代码创建了JSON数据的一部分):

Response.ContentType = "application/json; charset=utf-8"; 
      bool val1 = (System.Web.HttpContext.Current.User != null) && System.Web.HttpContext.Current.User.Identity.IsAuthenticated; 
      string category = Request.QueryString["category"]; 
      //string a = JsonConvert.SerializeObject(getProducts(category)); 
      var a = getProducts(category); 
      // instantiate a serializer 
      JavaScriptSerializer TheSerializer = new JavaScriptSerializer(); 

      var TheJson = TheSerializer.Serialize(a); 
      Response.Write(TheJson); 

最后但并非最不重要的,如果我试图改变数据类型为文本,它会显示内容是用HTML网页代码中的JSON结构化的文本一起。

我在这里错过了什么?

回答

1

您需要确保ASP.NET不会呈现您放入响应中的json内容以外的其他任何内容。要做到这一点,事先明确回应:

Response.Clear(); 
Response.ContentType = "application/json; charset=utf-8"; 
... 

,并在年底前完成的响应马上:

Response.Write(TheJson); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 

this excellent answer,为什么CompleteRequest应该在这里,而不是使用的更广泛Request.End()

但是使用页面输出JSON看起来像一个开销。您可能想要检查更简单的方法,即Http Handlers。在互联网上有很多例子,这里是one

+0

'Response.End'通常是一个很糟糕的解决方法,可以用其他方式解决问题。它很难通过内部做线程中止来结束请求。即使[文档](https://msdn.microsoft.com/en-us/library/system.web.httpresponse.end(v = vs.110).aspx)说:_“此方法仅用于兼容性与ASP“_ –

+1

@JamesThorpe,的确,谢谢指出。研究了一下,学到了很多,更好的选择更新了答案 – Andrei

+0

这就是为什么我喜欢这样 - 每个人都可以学习:) –

相关问题