我有两个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" />
那么问题可能是什么?
答案 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。