Метод запускается при загрузке страницы, но не через кнопку 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-разметку. И вы должны воссоздавать их при каждом запросе, после того, как они были созданы.
Пожалуйста, посмотрите на мой другой ответ.