DropDownList项目在SelectedIndexChanged上重置

时间:2010-09-17 14:37:19

标签: c# asp.net ajax

我的页面上有一个级联下拉列表。第一个下拉列表包含事件列表。第二个下拉列表包含与会者列表。选择事件后,将进行AJAX调用以获取该事件的与会者列表,并填充第二个下拉列表。

我的问题是,对于与会者下拉菜单,我希望将用户重定向到SelectedIndexChanged事件上的URL,并在查询字符串中使用所选值。但是在SelectedIndexChanged事件中,第二个下拉列表中的所有项都将被重置。这是我的代码:

<script type="text/javascript" language="javascript">      

    $(document).ready(function()
    {
        $('#<%= ddlEvents.ClientID %>').change(function() 
        {
           $.ajax({
               type: "POST",
               url: 'Default.aspx/PopulateAttendees',
               data: '{EventId: ' + $('#<%= ddlEvents.ClientID %>').val() + '}',
               contentType: "application/json; charset=utf-8",
               dataType: "json",
               success: OnAttendeesPopulated
           });
        });


        function OnAttendeesPopulated(response)
        {
            var attendees = response.d;
            var attendeesDropdown = $("#<%= ddlAttendees.ClientID %>");

            attendeesDropdown.removeAttr("disabled");
            $.each(attendees, function()
            {
                attendeesDropdown.append($("<option</option>").val(this['Value']).html(this['Text']));
            });
        }
    });

</script>

<asp:DropDownList ID="ddlEvents" runat="server"></asp:DropDownList>
<br /><br />
<asp:DropDownList ID="ddlAttendees" runat="server" Enabled="false" onselectedindexchanged="ddlAttendees_SelectedIndexChanged" AutoPostBack="true">
</asp:DropDownList>

在我的代码隐藏中:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //Bind dropdown to Events
        ddlEvents.DataSource = EventsList();
        ddlEvents.DataTextField = "Name";
        ddlEvents.DataValueField = "EventID";
        ddlEvents.DataBind();
    }
}


[System.Web.Services.WebMethod]
public static ArrayList PopulateAttendees(int EventId)
{
    ArrayList attendees = new ArrayList();
    attendees = GetAttendees(EventId);

    return attendees;
}


protected void ddlAttendees_SelectedIndexChanged(object sender, EventArgs e)
{
    string AttendeeId = ddlAttendees.SelectedValue;

    Response.Redirect("http://mysite.com?id=" + AttendeeId);
}

当点击SelectedIndexChanged事件时,ddlAttendees为空。

有谁知道如何将这些项目保存在ddlAttendees中?

2 个答案:

答案 0 :(得分:2)

我很想包含一个客户端索引更改事件,该事件会在回发之前将与会者ID写入隐藏字段。然后从代码隐藏中访问此字段。我认为ddl正在失去状态,因为它填充了客户端(我知道这两个声明听起来很矛盾!)。但我认为隐藏的字段将比ddl更可靠地持久化。

答案 1 :(得分:0)

问题是,当你为了更新dom而进行ajax调用时,实际上并没有在页面意义上更新它,因为它知道它是否在那里,因为它已经渲染了dom加载后客户端看到了变化但页面不知道已经进行了更改。