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

时间:2013-07-26 14:28:45

标签: c# html asp.net

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

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

通过用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)),如果我手动将0更改为Page_Load中的另一个数字,它会被另一个过滤类型,但如果我单击以编程方式添加的按钮,除了页面刷新之外没有任何其他事情发生。

我知道回复检查是通过在其之前和之内添加文本替换来实现的。

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

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

那么问题可能是什么?

2 个答案:

答案 0 :(得分:2)

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

服务器端Click event将在服务器上触发,但不允许您传递参数。您将只获取按钮实例和空EventArgs实例。

您最好使用Command event并结合CommandArgument property

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

事件处理程序将使用CommandArgument的{​​{1}}属性从单击的按钮访问参数:

CommandEventArgs

答案 1 :(得分:1)

嗯,这是我认为每个asp.net开发人员花一些时间来解决的常见问题。它的常见部分,即asp.net事件系统不起作用,因为窗口形式。  Page对象以及该页面上的所有控件都有lifecycle events,这些控件在任何请求期间都会触发,即使它来自更新面板也是如此。  当您通过代码创建这些控件时,您必须记住,这些控件的所有事件都应该作为Page对象的一部分。这就是为什么你必须在Page_Init事件中创建这些对象,然后才会触发所有其他控件的事件。  还请记住,您必须将这些控件创建为asp.net对象:

var btn = new Button();

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

请查看我的另一个answer