2012-04-08 7 views
0

まず、私の英語のためにお詫び申し上げます。 私はjsonエリアのnewbyです。 私の問題は、私は、asp:LinkBut​​tonまたは任意のasp:要素、coz私は正しいsintaxを作成することはできませんjson応答でrecivedデータを解析することはできません。 Especificallyは、私が何をしようとしている、これです:asp:LinkBut​​tonからJsonデータへのレスポンスを入力するには

<script type="text/javascript"> 
    $.getJSON("http://www.carqueryapi.com/api/0.3/?callback=?", { cmd: "getMakes", min_year:"1941", max_year:"2012"}, function (data) { 


      var makes = data.Makes; 
      for (var i = 0; i < makes.length; i++) { 

       ($("<asp:LinkButton ID=\"lb" + i +"\" runat=\"server\" />").text(makes[i].make_display)).appendTo("#lbProva"); 
      } 
     }); 
<script> 

<ul id="lbProva" class="lb_prova" > 

    </ul> 

が、私は多くの可能性をしようと試みましたが、誰が正しかったんだって誰かが私を助けることができることを願っています。 ありがとうございます。

+0

JSONの話をする前に、のは、サーバーコードについて話しましょう。 LinkBut​​tonsを送信するのは意味がありませんが、ajax呼び出しの応答です。クライアント側では何もすることはできません。 –

答えて

1

クライアントサイドのjavascriptでasp.netサーバーコントロールを作成することはできません。クライアントサイドでjsonデータを使用する場合は、すでに生成されたhtmlコントロールに適用する必要があります。

1

実際には、サーバー上でのみサーバーコントロールを作成できます。そのため、AJAXコール応答をサーバーに渡し、ページ上の目的の領域をリフレッシュするようにする方法が問題です。

まずバリアント

<script type="text/javascript"> 
    $(function() { 
     $.getJSON("http://www.carqueryapi.com/api/0.3/?callback=?", { cmd: "getMakes", year: "2009" }, 
     function (data) { 
      //The 'data' variable contains all response data. 
      var makes = $.map(data.Makes, function (make) { return make.make_display; }).join(";"); 
      document.getElementById("<%= CarMakersHiddenField.ClientID %>").value = makes; 
      __doPostBack("<%= CarMakersUpdatePanel.ClientID %>", ""); 
     }); 
    }); 
</script> 

<asp:UpdatePanel runat="server" ID="CarMakersUpdatePanel" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:HiddenField runat="server" ID="CarMakersHiddenField" /> 
     <asp:BulletedList runat="server" ID="MakersList" DisplayMode="LinkButton"> 
     </asp:BulletedList> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Serverコード:サーバーにメーカーオブジェクトの配列のようないくつかの複雑なオブジェクトを渡す必要がある場合

protected void Page_Load(object sender, EventArgs e) 
{ 
    MakersList.Items.Clear(); 
    foreach (var maker in CarMakersHiddenField.Value.Split(';')) 
    { 
     MakersList.Items.Add(maker); 
    } 
} 

第2のアプローチは、よりsiutableです。その場合、このオブジェクトをクライアント上のJSON文字列にシリアル化し、サーバー上で逆シリアル化することができます。ビットの変更を伴う以前のバージョンのように見えます:

<script type="text/javascript"> 
    $(function() { 
     $.getJSON("http://www.carqueryapi.com/api/0.3/?callback=?", { cmd: "getMakes", year: "2009" }, 
     function (data) { 
      //The 'data' variable contains all response data. 
      var serializedString = Sys.Serialization.JavaScriptSerializer.serialize(data.Makes); 
      document.getElementById("<%= CarMakersHiddenField.ClientID %>").value = serializedString; 
      __doPostBack("<%= CarMakersUpdatePanel.ClientID %>", ""); 
     }); 
    }); 
</script> 

マークアップは最初のバージョンと同じです。 Serverコード:

[Serializable] 
public class Make 
{ 
    public string make_id; 
    public string make_display; 
    public bool make_is_common; 
    public string make_country; 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    MakersList.Items.Clear(); 
    if (!String.IsNullOrEmpty(CarMakersHiddenField.Value)) 
    { 
     var serializer = new DataContractJsonSerializer(typeof(Make[])); 
     using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(CarMakersHiddenField.Value))) 
     { 
      var makes = serializer.ReadObject(stream) as Make[]; 
      if (makes != null) 
      { 
       foreach (var maker in makes) 
       { 
        MakersList.Items.Add(new ListItem(maker.make_display, maker.make_id)); 
       } 
      } 
     } 
    } 
} 
+0

ありがとう、そんなにユリ!!これはまさに私が探していたものです!あなたの説明のために皆さん、ありがとう! – Lorenzo

関連する問題