Как я могу создать ASP.NET AJAX UpdatePanel, который обновляет повторитель, когда элемент управления DropdownList изменил выбранный элемент? - PullRequest
0 голосов
/ 02 февраля 2012

У меня простая проблема.У меня есть выпадающий список и повторитель данных.Когда пользователь меняет выбор в выпадающем списке, я хотел бы перезагрузить ретранслятор.Я хотел бы использовать ASP.NET AJAX, чтобы это не обновляло всю страницу.Я прочитал документацию ASP.NET AJAX снова и снова, но не могу найти четкого объяснения, как это сделать.Вот часть моей страницы ASPX

<asp:ScriptManager id="smScriptManager" runat="server" />
<asp:DropDownList id="ddlLocations" runat="server" AutoPostback="true" OnSelectedIndexChanged="ddlLocations_SelectedIndexChanged">
  <asp:ListItem Text="Location 1" Value="1"></asp:ListItem>
  <asp:ListItem Text="Location 2" Value="2"></asp:ListItem>
  <asp:ListItem Text="Location 2" Value="3"></asp:ListItem>
</asp:DropDownList>
<asp:UpdatePanel id="upUpdatePanel" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="ddlLocations" EventName="SelectedIndexChanged" />
  </Triggers>
  <ContentTemplate>
    <asp:Repeater id="rptItems" runat="server">
      <ItemTemplate>
        ... data bound fields for each location go here ...
      </ItemTemplate>
    </asp:Repeater>
  </ContentTemplate>
</asp:UpdatePanel>

В моем коде есть отдельная функция привязки данных, которая связывает повторитель.В настоящее время я вызываю его при загрузке страницы, только если Page.IsPostBack = false.Таким образом, страница загружается нормально с первого раза, и репитер загружается со всеми данными для местоположения 1 (так как он выбран).У меня также есть код в функции "ddlLocations_OnSelectedIndexChanged", который вызывает функцию привязки данных.На самом деле, если я удаляю все содержимое AJAX / UpdatePanel, страница работает нормально (хотя и полностью обновляет страницу).

При использовании содержимого AJAX, когда пользователь выбирает Расположение 2 или Расположение 3, я получаюследующая ошибка JS:

Сообщение: Sys.WebForms.PageRequestManagerServerErrorException: StartIndex не может быть меньше нуля.Имя параметра: startIndex Строка: 4723 Char: 21 Код: 0 URI: http://localhost/ScriptResource.axd?d=sTWt9V9Pb7V99ft1kYaE90l3bO7maFff4srx6ham1O6ideYDjPbZU5dv5QJjmzBCPxFQIGrdN2PIuOG7y3evLrZF4ETSZ2de6iwiLo9yZ4w0RvtADl-5JZXm0C_1eyn2F6p6fNX5ZDkxi6yJHF0czKc2lWjUlRrkShaVa4T1l8BPah6A0&t=ffffffff9bdfdd38

У кого-нибудь есть идеи, почему это происходит?Я делаю что-то неправильно?Я чувствую, что не совсем понимаю, как работает UpdatePanel.У меня возникает ощущение, что я должен сначала настроить страницу для работы без компонента UpdatePanel / AJAX (и выполнить полное обновление страницы).Затем добавьте в UpdatePanel / AJAX материал и каким-то образом код волшебным образом выяснит, что я просто хочу обновленный Repeater HTML.Или что-то типа того.Есть идеи?

ОБНОВЛЕНИЕ: Вот как работает мой внутренний код

protected void Page_Load(object sender, EventArgs e)
{
  if(!Page.IsPostBack)
  {
    this.BindData();
  }
}

protected void BindData()
{
  this.BindDropDownList();
  this.BindRepeater();
}

protected void BindDropDownList()
{
  ...call code for binding drop down list...
  (ddlLocations is actually databound - I simplified it above for purposes of this post)
}

protected void BindRepeater()
{
  ...call code for binding the repeater...
}

protected void ddlLocations_SelectedIndexChanged(object sender, EventArgs e)
{
  this.BindRepeater();
}

Спасибо, Кори

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