Заполнение DropDownList из другого DropDownList с использованием AJAX 3.5 - PullRequest
2 голосов
/ 07 апреля 2011

Я использую 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 все работало должным образом.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

здесь у вас есть три примера каскадного выпадающего списка с использованием контроллера и веб-службы.

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

Я могу вставить всю информацию, но я считаю, что ссылка будет лучше.даже Стивен предлагает пример кода.brgds.

1 голос
/ 07 апреля 2011

В ответ на комментарий Анди: 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.

0 голосов
/ 07 апреля 2011

Я ценю ответы всех и уверен, что ваши решения намного элегантнее, быстрее и правильнее (все еще в процессе работы по вашей ссылке @sebastian_h).Тем временем, сохраняя AutoPostBack="true" в первом DDL и добавляя

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

в updatePanel, начал работать.Я, должно быть, изменил некоторые другие настройки в моей последней попытке добавить цель.

Еще раз спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...