如何从Json数据响应中填充asp:LinkBut​​ton

时间:2012-04-08 13:52:14

标签: asp.net json

首先为我的英语道歉。 我是json地区的新人。 我的问题是,我无法将json响应中收到的数据解析为asp:LinkBut​​ton或任何asp:元素,因为我无法创建正确的sintax。 特别是,我正在尝试做的是:

<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>

我希望有人可以帮助我因为我尝试了很多可能性,但没有人是正确的。 提前谢谢你。

2 个答案:

答案 0 :(得分:1)

您无法在客户端的javascript中创建asp.net服务器控件。如果要在客户端使用json数据,则必须将其应用于已生成的html控件。

答案 1 :(得分: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>

服务器代码:

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

如果您需要将一些复杂的对象(如制造商对象数组)传递给服务器,则第二种方法更容易理解。在这种情况下,您可以将此对象序列化为客户端上的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>

标记与第一个版本相同。 服务器代码:

[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));
                }
            }
        }
    }
}