我的页面上有一个级联下拉列表。第一个下拉列表包含事件列表。第二个下拉列表包含与会者列表。选择事件后,将进行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中?
答案 0 :(得分:2)
我很想包含一个客户端索引更改事件,该事件会在回发之前将与会者ID写入隐藏字段。然后从代码隐藏中访问此字段。我认为ddl正在失去状态,因为它填充了客户端(我知道这两个声明听起来很矛盾!)。但我认为隐藏的字段将比ddl更可靠地持久化。
答案 1 :(得分:0)
问题是,当你为了更新dom而进行ajax调用时,实际上并没有在页面意义上更新它,因为它知道它是否在那里,因为它已经渲染了dom加载后客户端看到了变化但页面不知道已经进行了更改。