2

ajax ツールキットで asp.net 3.5 を使用しています。

問題: 更新パネルに 2 つのドロップダウン リストを持つカスタム コントロールがあります。最初の DDL にはプロパティがAutoPostBack="true"あり、選択すると 2 番目の DDL にデータが取り込まれます。この問題は、最初のページの読み込み後に初めて DDL が選択されたときに発生し、ページ全体が再読み込みされます。最初の DDL の項目が 2 回目に選択されると、すべてが期待どおりに機能します。

UpdatePanel に Triggers を追加しようとしましたが、結果は変わりません。

どんな助けでも大歓迎です。

.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サービスを使用したカスケードドロップダウンリストの3つの例があります。

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

Andee のコメントに応えて:What do you mean the update panel isn't AJAX?

まず、通常の Web ページで何が起こるかについて話しましょう。AJAX も更新パネルもありません。

ページはサーバーから取得され、外部の JavaScript、外部の CSS、画像などがあります。それぞれが HTTP リクエストです。したがって、完了するまでに 5、10、20 以上の http リクエストが存在する可能性があります。目標は、一度に 2 つの要求しか持つことができないため、できる限り少なくすることです (これを回避する方法があります)。

問題は、サーバーから取得する必要があるページ上の少量のデータを変更したい場合はどうするかということです。ページをポストバックして、同じ変更されていないデータをすべて取得し、すべての http 要求を処理するのはクレイジーかもしれません。これが AJAX の優れた点です。javascript を使用してサーバーと通信し、データを返してもらうことができます。1 つの http リクエストのみを使用し、データのみを取得します。つまり、HTTP リクエストは 1 つだけで、ファイル サイズも小さいため、はるかに高速です。さらに、サーバーから新しいページを要求していないため、ページのちらつきはありません。

一方、更新パネルは 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 に答える