使用AJAX 3.5从另一个下拉列表填充下拉列表
本文关键字:下拉列表 另一个 填充 AJAX 使用 | 更新日期: 2023-09-27 17:49:21
我正在使用asp.net 3.5与ajax工具包。
问题:我有一个自定义控件,在更新面板中有两个下拉列表。第一个DDL的属性为AutoPostBack="true"
,选择后填充第二个DDL。问题是在初始页面加载后第一次选择DDL,整个页面重新加载。第一个DDL中的项第二次被选中时,一切都按预期工作。
我已经尝试在UpdatePanel中添加触发器,但这不会改变结果。
任何帮助都是感激的。
.ascx :
<asp:UpdatePanel ID="popDates" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<p>
<asp:DropDownList ID="ddlDivision" runat="server" AutoPostBack="true" style="width:300px"></asp:DropDownList>
<asp:RequiredFieldValidator ID="requiredDivision" runat="server"
ControlToValidate="ddlDivision" ErrorMessage="* Please specify a value"
ValidationGroup="valGroupGetDates"
InitialValue="Select..." SetFocusOnError="True" CssClass="formValidation">
</asp:RequiredFieldValidator>
</p>
<p>
<asp:DropDownList ID="ddlKMA" runat="server" Enabled="False" AutoPostBack="true" style="width:300px"></asp:DropDownList>
<asp:RequiredFieldValidator ID="requiredKMA" runat="server"
ControlToValidate="ddlKMA" ErrorMessage="* Please specify a value"
ValidationGroup="valGroupGetDates"
InitialValue="Select..." SetFocusOnError="True" CssClass="formValidation">
</asp:RequiredFieldValidator>
</p>
</ContentTemplate>
</asp:UpdatePanel>
ascx.cs :
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsAsync || Page.IsPostBack)
{
String target = Page.Request.Params.Get("__EVENTTARGET");
//Division Session
Session["divisionDropDown"] = ddlDivision.SelectedItem.Value;
populateDivisionDDL();
ddlDivision.SelectedValue = Session["divisionDropDown"].ToString();
if (target != "" && target != null)
{
if (target.Contains("ddlDivision"))
{
populateKMA(ddlDivision.SelectedValue);
}
}
}
if (!Page.IsPostBack)
{
populateDivisionDDL();
ddlKMA.Items.Clear();
ddlKMA.Items.Add(default_item());
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
}
aspx :
<body>
<form id="ViewSPANodeDatesForm" runat="server">
<div>
<asp:ScriptManager ID="ScriptManagerDates" runat="server"></asp:ScriptManager>
<viewControl:SPANodeDates ID="SPANodeDates1" runat="server"></viewControl:SPANodeDates>
</div>
</form>
</body>
注意:在添加ajax控件之前,一切正常。
谢谢!
这里有三个使用controller和webservice的级联下拉列表示例。
http://stephenwalther.com/blog/archive/2008/09/07/asp-net-mvc-tip-41-creating-cascading-dropdown-lists-with-ajax.aspx我可以粘贴整个信息,但我相信链接会更好。甚至Stephen也提供了它的代码示例。brgds .
回应Andee的评论:What do you mean the update panel isn't AJAX?
首先让我们谈谈在一个正常的网页中发生了什么。没有AJAX,没有更新面板。
页面是从服务器,和任何外部javascript,外部css,图像等拉。每个都是一个HTTP请求。所以你可能有5个,10个,20多个http请求。目标是尽可能少,因为您一次只能有两个请求(有办法解决这个问题)。
问题是,如果我们想要改变页面上的少量数据,需要我们从服务器获取它,该怎么办?回发页面并获得所有相同的未更改数据,并处理所有http请求,这可能是疯狂的。这就是AJAX的美妙之处,我们可以使用javascript与服务器对话并让它返回给我们一些数据。它只使用一个http请求,我们只返回数据。换句话说,它要快得多,因为它只有一个http请求,而且文件大小很小。此外,没有页面闪烁,因为我们没有从服务器请求一个新的页面。
另一方面,更新面板给您的印象是AJAX(没有页面闪烁),但它仍然做一个post back,您会招致所有不必要的HTTP请求。这意味着虽然您没有得到页面闪烁,但您仍然会得到界面延迟,因为它需要比真正的AJAX调用更长的时间来获取数据。
我感谢每个人的回应,我相信你的解决方案更优雅,更快,而且实际上是正确的(仍然在通过你的链接@sebastian_h工作的过程中)。同时,将AutoPostBack="true"
保持在第一DDL中,并加入
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlDivision" EventName="SelectedIndexChanged" />
</Triggers>
的updatePanel开始工作。我一定是在上次尝试添加目标时更改了其他设置。
再次感谢!