0

我有两个 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:button 以确保它与添加按钮的方式无关,如下所示(从搜索中推荐一些额外的东西):

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

那么可能是什么问题?

4

2 回答 2

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));
}
于 2013-07-26T14:51:03.927 回答
1

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

var btn = new Button();

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

请看看我的另一个答案

于 2013-07-26T14:54:34.397 回答