2

我正在使用带有 ajax 工具包的 asp.net 3.5。

问题:我有一个自定义控件,在更新面板中有两个下拉列表。第一个 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 控件之前,一切都按预期工作。

谢谢!

4

3 回答 3

2

这里有三个使用控制器和 Web 服务的级联下拉列表示例。

http://stephenwalther.com/blog/archive/2008/09/07/asp-net-mvc-tip-41-creating-cascading-dropdown-lists-with-ajax.aspx

我可以粘贴整个信息,但我相信链接会更好。甚至斯蒂芬提供了它的代码示例。brgds。

于 2011-04-06T23:36:02.720 回答
1

回应安迪的评论:What do you mean the update panel isn't AJAX?

首先让我们谈谈在普通网页中发生的事情。没有 AJAX,没有更新面板。

该页面是从服务器中提取的,以及任何外部 javascript、外部 css、图像等。每一个都是一个 HTTP 请求。因此,当您完成时,您可能有 5,10,20+ 个 http 请求。目标是尽可能少,因为一次只能有两个请求(有解决方法)。

问题是,如果我们想要更改页面上需要我们从服务器获取的少量数据怎么办?回发页面并取回所有相同的未更改数据并处理所有 http 请求可能很疯狂。这就是 AJAX 的美妙之处,我们可以使用 javascript 与服务器对话并让它返回给我们一些数据。它只会使用一个 http 请求,我们只取回数据。换句话说,它要快得多,因为它只有一个 http 请求,而且文件很小。此外,没有页面闪烁,因为我们没有从服务器请求新页面。

另一方面,更新面板给您的印象是 AJAX(无页面闪烁),但它仍然会进行回发,并且您会产生所有不需要的 HTTP 请求。这意味着虽然您没有出现页面闪烁,但您仍然会遇到界面延迟,因为获取数据所需的时间比真正的 AJAX 调用要长。

于 2011-04-07T00:06:49.400 回答
0

我感谢每个人的回复,我相信您的解决方案更加优雅、更快并且实际上是正确的(仍在处理您的链接@sebastian_h)。同时,保留AutoPostBack="true"第一个 DDL 并添加

<Triggers>
   <asp:AsyncPostBackTrigger ControlID="ddlDivision" EventName="SelectedIndexChanged" />
</Triggers>

到 updatePanel 开始工作。在我最后一次添加目标的尝试中,我一定更改了其他一些设置。

再次感谢!

于 2011-04-07T00:12:07.900 回答