方法是在页面加载时触发的,但不是通过asp按钮触发的

本文关键字:asp 按钮 加载 方法 | 更新日期: 2023-09-27 18:25:00

我有两个asp:Labels,第一个用几个按钮替换,第二个用项目列表替换。

我想点击按钮来过滤项目。

按钮的内容是通过用html替换文本以编程方式添加的,效果良好。

asp:

<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)),如果我手动将page_load中的0更改为另一个数字,它将按其他类型过滤,但如果我单击以编程方式添加的按钮,除了页面刷新之外,什么都不会发生。

我知道后回查是通过在它之前和里面添加一个文本替换来工作的。

我还添加了一个asp:按钮,以确保它与按钮的添加方式无关,如下所示(从搜索中推荐一些额外的东西):

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

那么问题出在哪里呢?

方法是在页面加载时触发的,但不是通过asp按钮触发的

OnClientClick属性指定单击按钮时在浏览器中运行的javascript。由于您可能没有名为Load_Items的javascript函数,这将生成一个脚本错误,然后该按钮将导致表单返回。

服务器端Click事件将在服务器上激发,但不允许您传递参数。您将只获得按钮实例和一个空的EventArgs实例。

您最好将Command事件与CommandArgument属性结合使用。

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

事件处理程序将使用CommandEventArgsCommandArgument属性来访问单击按钮的参数:

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

嗯,这是我认为每个asp.net开发人员都会遇到的常见问题。它的共同点是,asp.net事件系统不起作用,就像windows窗体一样。Page对象和该页面上的所有控件都有生命周期事件,这些事件在任何请求期间都会触发,即使是来自更新面板。当您通过代码创建这些控件时,必须记住,这些控件的所有事件都应作为Page对象的一部分工作。这就是为什么必须在Page_Init事件中创建这些对象,然后才能触发所有其他控件的事件。还请记住,您必须将这些控件创建为asp.net对象:

var btn = new Button();

但不是简单地添加html标记。当它们被创建时,你必须在每个请求之后重新创建它们。

请看一下我的另一个答案。