2013-07-25 81 views
0

我在jQuery的新手,我有一個問題: 我有兩個.aspx文件中:其中包含腳本從獲取數據的.aspx jQuery的AJAX

<script type ="text/javascript"> 
    $(document).ready(function() { 
     var schemaName = GetURLParameters('schemaName'); 
     var key = GetURLParameters('key'); 
     $.post("dataloader.aspx", { 
      name: schemaName, 
      key: key 
     }); 
    }); 
</script> 

這將參數傳遞給其他頁面, 「dataloader.aspx」。這裏是 「dataloader.aspx.cs」 代碼:

protected void Page_Load(object sender, EventArgs e) 
     { 
      Response.ContentType = "application/json"; 
      var schemaName = Request.Form["name"]; 
      var key = Request.Form["key"]; 

      Loader loader = ConnectionManager.getLoader(); 
      Dictionary<string, string> name_value = new Dictionary<string, string>(); 
      if (!string.IsNullOrEmpty(schemaName)) 
      { 
       var schema = loader.GetSchema(schemaName); 
       var qcontext = new SimpleLoader.BOService.QueryContext(); 
       qcontext.InitQueryContext(); 

       var element = loader.GetObjectByKey(schema, key); 
       var viselems = element._Schema.GetVisibleElems(); 
       var cardElems = viselems.Where(x => !(x is SchemaElemDetail)).ToList(); 

       foreach (var elem in cardElems) 
       { 
        var value = (element.GetValue(elem.Name) ?? "").ToString(); 
        if (!string.IsNullOrEmpty(value)) 
        { 
         name_value.Add(elem.Name, value); 
        } 
       } 
       Response.Write(name_value); 
       Response.Flush(); 
       Response.End(); 
      } 

     } 

正如你看到的,I,M加入一些數據字典。我想通過jQuery將此字典發送到「clientcard.aspx」客戶端,但我不知道如何......您能幫助我嗎?我會非常感激。

+0

您需要將字典序列化爲JSON。除了我之外沒有其他答案提到這一步。而且這是最關鍵的! – marteljn

回答

1

一種方法是在dataloader.aspx中調用webmethod。假設你的函數的名稱將是getNameValue,在你的aspx頁面,你就會有這樣一個WebMethod:(你會基本代碼Page_Load事件轉移到這個)

[System.Web.Services.WebMethod] 
public static Dictionary<string, string> getNameValue(string name, string keyN) 
{ 
    var schemaName = name; 
    var key = keyN; 

    Loader loader = ConnectionManager.getLoader(); 
    Dictionary<string, string> name_value = new Dictionary<string, string>(); 
    if (!string.IsNullOrEmpty(schemaName)) 
    { 
    var schema = loader.GetSchema(schemaName); 
    var qcontext = new SimpleLoader.BOService.QueryContext(); 
    qcontext.InitQueryContext(); 

    var element = loader.GetObjectByKey(schema, key); 
    var viselems = element._Schema.GetVisibleElems(); 
    var cardElems = viselems.Where(x => !(x is SchemaElemDetail)).ToList(); 

    foreach (var elem in cardElems) 
    { 
     var value = (element.GetValue(elem.Name) ?? "").ToString(); 
     if (!string.IsNullOrEmpty(value)) 
     { 
     name_value.Add(elem.Name, value); 
     } 
    }  
    } 
    return name_value; //will be automatically serialised to JSON because of the dataType specification in ajax call. 
} 

你會在調用這個函數jQuery的在ready這樣的:

$(document).ready(function() { 
     var schemaName = GetURLParameters('schemaName'); 
     var key = GetURLParameters('key'); 
     //just in case 
     var data = JSON.stringify({ 
      name: schemaName, 
      keyN: key 
     }); 

     $.ajax({ 
      type: "POST", 
      url: "dataloader.aspx/getNameValue", 
      data: data, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      error: function (xhr, status, error) { 
       var msg = JSON.parse(xhr.responseText); 
       alert(msg.Message); 
      } 
      }).done(function (msg) { 
      //msg.d will contain your dictionary 
      }); 
    }); 

之所以它能夠更好地使用這種方法是代碼變得可重用。在你目前的設置中,如果你想獲得name_value字典,你必須重新加載aspx頁面。現在你只需要調用這個方法。

希望這會有所幫助!

+0

它不會自動將其轉換爲JSON,我很確定默認是xml。我想你需要添加'[ScriptMethod(ResponseFormat = ResponseFormat.Json)]''屬性。 – marteljn

+0

@marteljn http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/ – krishgopinath

+0

你或者需要做我做過的事情或者在類定義中添加'[ScriptService]'。該屬性甚至在您的鏈接中提到... – marteljn

0

最好從DataLoader.aspx頁面轉換爲JSON。然後,在上面的代碼段添加回調:

$.post("dataloader.aspx", { 
     name: schemaName, 
     key: key, 
     success: function(d) { .. } 
    }); 

變量「d」包含響應,這很可能是字符串。然後,您可以使用JQuery以相同的方式將數據發送到下一頁,方法是使用JSON.parse並解析內容,或直接傳遞JSON。

+0

我該怎麼做?=)我的意思是代碼=) –

0

爲了創建你想要的JSON,你將需要序列化你的字典。您可以使用System.Web.Script.Serialization.JavaScriptSerializer

var JSSerializer = new JavaScriptSerializer(); 
Response.Write(JSSerializer.Serialize(name_value)); 

然後在您的JS代碼:

$(document).ready(function() { 
     var schemaName = GetURLParameters('schemaName'); 
     var key = GetURLParameters('key'); 
     $.post("dataloader.aspx", { 
      name: schemaName, 
      key: key 
     }, function(data){ 
     //Here is your success callback and data should be your JSON. 
     }); 
    }); 

爲了使這種清潔你可能要考慮使用一個HTTP處理程序模板(.ashx)代替.aspx網頁,讓您贏了沒有全部的aspx頁面(即代碼隱藏和查看)。