2012-06-29 54 views
4

的簡單示例(問題與兩個回覆的帖子的幫助下解決了 - 見下文)asp.net jQuery的AJAX JSON:交換數據

我將不勝感激幫助得到一個之間交換數據的JSON數據的簡單例子瀏覽器(使用JavaScript/JQuery)和ASP.NET(使用Visual Studio 2010)。

當我點擊一個按鈕時,執行以下操作:

<script type="text/javascript"> 
    bClick = function() { 
     var myData = { "par": "smile" }; 
     alert("hi "+myData.par); 
     $.ajax({ 
      url: "ericHandler.ashx", 
      data: myData, 
      dataType: 'json', 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      success: function (data) { alert("DIDit = " + data.eric); }, 
      error: function (data, status, jqXHR) { alert("FAILED:" + status); } 
     }); 
    } 
</script> 

在Visual Studio中,我有一個ASHX文件相關聯下面的代碼。當我運行它並單擊按鈕時,一切都按預期工作,除非我沒有看到myData傳遞給C#代碼 - 我在調試器中查看context.Request.QueryString並顯示「{}」。

我所看到的例子使用

string stringParam = (string)Request.Form("stringParam"); 

但Visual Studio的 「請求」 似乎並沒有被定義。我想要做的就是看到數據移動到兩邊,而且我看起來已經走到了一半。任何幫助,將不勝感激。

--C#代碼 -

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace CSASPNETSerializeJsonString 
{ 
/// <summary> 
/// Summary description for ericHandler 
/// </summary> 
public class ericHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     string rq = context.Request.QueryString["par"]; 

     context.Response.ContentType = "application/json"; 
     context.Response.Write("{\"eric\":\"12345\"}"); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

}

*議決 首先,如果你想從JavaScript發送一些表單參數ASP.NET應該使用Ajax調用在下面的第二篇文章,不要在數據上使用stringify。換句話說,如果不指定要發送的數據是json,那麼缺少任何規範默認爲'application/x-www-form-urlencoded')。這將導致對象的字段以「url」格式添加(field = X & field2 = Y & field3 = Z ..),並因此在ASP.NET中使用Request.Form [「field」]顯示。其次,如果你真的想發送JSON數據,那麼指定這個類型是發送的內容(就像我上面所做的那樣),並在接收端使用InputStream。然後需要進一步解析接收到的字符串來獲取字段值。

在我的示例中,我發回的JSON數據具有「手動」編碼爲字符串。我相信有一個JSON序列化例程,以便可以發送C#對象。

回答

3

我得到了這個工作馬上。這是其最基本的形式:

HTML:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 

    <script language="javascript" type="text/javascript"> 
     $(document).ready(function() { 
      $.ajax({ 
       url: 'Handler.ashx', 
       type: 'POST', 
       success: function (data) { 
        alert(data); 

       }, 
       error: function (data) { 
        alert("Error"); 
       } 
      }); 
     }); 
    </script> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 

    </form> 
</body> 
</html> 

代碼背後:

<%@ WebHandler Language="C#" Class="Handler" %> 

using System; 
using System.Web; 

public class Handler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "text/plain"; 
     context.Response.Write("Hello World"); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+0

您的例子顯示ASP.NET被傳遞給瀏覽器的數據,但我遇到的問題是移動它另一個方向。因此,失敗的行是:「string rq = context.Request.QueryString [」par「];」 - 我試圖讓myData的定義從瀏覽器傳遞到ASP.NET。任何進一步的想法(並感謝迄今爲止的努力!)? –

+0

謝謝!這是有幫助的 - 我會把我的總結放在我原來的文章中。 ...埃裏克 –

5

其他資源建議從AJAX調用中刪除的contentType: 'application/json; charset=utf-8',

$.ajax({ 
      url: "ericHandler.ashx", 
      data: myData, 
      dataType: 'json', 
      type: 'POST', 
      success: function (data) { alert("DIDit = " + data.eric); }, 
      error: function (data, status, jqXHR) { alert("FAILED:" + status); } 
     }); 

閱讀服務器端的值:

string myPar = context.Request.Form["par"]; 

你還可以嘗試:

string json = new StreamReader(context.Request.InputStream).ReadToEnd(); 

這是這裏提到:https://stackoverflow.com/a/8714375/139917

+0

我想你建議(字符串化),但沒有改變 - 在接收C#代碼中,變量RQ爲空和檢查「context.Request.QueryString」顯示空集「{}」。此外,其他示例不使用stringify - 請參閱http://stackoverflow.com/questions/5756147 –

+0

@EricSchneider - 你是對的。 jQuery爲你做。由於您正在使用HTTP POST方法。您需要使用Request.Form [「myValue」]訪問您的值。我編輯了我的回覆。 – DaveB

+0

使用Request.Form沒有幫助,但你的第二個建議使用Request.InputStream工作!我得到了由JavaScript生成的序列化數據。當然,現在需要解析,這可能是問題的根源,因爲ASP.NET可能沒有從JSON到某些數據結構的良好映射。 –