Метод запускается при загрузке страницы, но не через кнопку asp

У меня есть два asp: ярлыки, первый из которых заменен несколькими кнопками, а второй со списком элементов.

Я хочу нажать на кнопки, чтобы отфильтровать элементы.

Содержимое кнопок добавляется программно, заменяя текст HTML и работает нормально.

жерех:

<form id="form1" runat="server">
  <asp:Label id="filters" runat="server" Text="Filters here"/>
  <asp:Label id="itemList" runat="server" Text="List of items here"/>
</form>

результирующий HTML метки фильтров:

<input type="submit" onclientclick="Load_Items(0)" runat="server" value="First"/>
<input type="submit" onclientclick="Load_Items(1)" runat="server" value="Second"/>
<input type="submit" onclientclick="Load_Items(2)" runat="server" value="Third"/>

соответствующие C#:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    Load_Items(0);
  }
}
public void Load_Items(int filterType)
{
  //code to load items (pseudo below)
  for each row in list
    if filterType = itemType
      build string
  replace second label with string
}

При загрузке страницы все происходит так, как я хочу, чтобы содержимое фильтровалось по первому элементу (следовательно, Load_Items(0)), и если я вручную изменяю 0 на другое число в Page_Load, он фильтрует по другим типам, но если я нажимаю кнопки, которые добавляются программно, ничего не происходит, кроме того, что выглядит как обновление страницы.

Я знаю, что проверка обратной записи работает путем добавления замены текста до и внутри нее.

Я также добавил кнопку asp:, чтобы убедиться, что это не связано со способом добавления кнопок, как показано ниже (с некоторыми дополнительными вещами, рекомендованными при поиске):

<asp:Button runat="server" CausesValidation="False" onclientclick="Load_Items(2); return false;" text="Submit" />

Так в чем может быть проблема?

2 ответа

Решение

OnClientClick Свойство указывает JavaScript для запуска в браузере при нажатии кнопки. Поскольку у вас, вероятно, нет функции JavaScript, называемой Load_Items, это вызовет ошибку сценария, а затем кнопка отправит форму обратно.

На стороне сервера Click Событие сработает на сервере, но не позволит вам передать параметр. Вы получите только экземпляр кнопки и пустой EventArgs пример.

Вы могли бы быть лучше, используя Command событие, в сочетании с CommandArgument собственность

<asp:Button runat="server" CommandArgument="2" OnCommand="Load_Items" ...

Обработчик события будет использовать CommandArgument собственность CommandEventArgs чтобы получить доступ к аргументу из нажатой кнопки:

protected void Load_Items(object sender, CommandEventArgs e)
{
    Load_Items(Convert.ToInt32(e.CommandArgument));
}

Ну, это общая проблема, которую, я думаю, каждый разработчик asp.net решает некоторое время. Общая часть этого, то, что система событий asp.net не работает, поскольку окна формируются. Page Объект и все элементы управления на этой странице имеют события жизненного цикла, которые запускаются во время любого запроса, даже если он поступает с панели обновления. Создавая эти элементы управления с помощью кода, вы должны помнить, что все события для этих элементов управления должны работать как часть Page объект. Вот почему вы должны создать эти объекты в Page_Init событие, прежде чем все остальные элементы управления будут запущены. Также имейте в виду, что вы должны создать эти элементы управления как объекты asp.net:

var btn = new Button();

Но не просто добавив HTML-разметку. И вы должны воссоздавать их при каждом запросе, после того, как они были созданы.

Пожалуйста, посмотрите на мой другой ответ.

Другие вопросы по тегам