为了解决这个问题,我必须在每个回发上进行数据绑定。
我的转发器看起来像这样:
<asp:Repeater id="MyRepeater" runat="server" onitemcommand="MyRepeater_ItemCommand">
<ItemTemplate>
<li>
<asp:Label id="Label" runat="server" />
<asp:LinkButton id="LinkButton1" runat="server" commandname="Complete" commandargument='<%# Eval("MyID") %>' text='<%# Eval("Title") %>' />
</li>
</ItemTemplate>
</asp:Repeater>
和我的代码隐藏是这样的:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SetupPage();
}
}
private void SetupPage()
{
// Do other stuff
MyRepeater.DataSource = Repository.GetStuff()
MyRepeater.DataBind();
}
protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
// Do all my stuff here
}
除非我注释掉if(!IsPostBack)行,否则不会调用MyRepeater_ItemCommand。一旦被注释掉并且转发器在每个回发上获得数据绑定,它就可以正常工作。我已经在很多其他页面中完成了这个,但就此而言似乎没有用。
其他人遇到过这种行为或有解决方案吗?
答案 0 :(得分:22)
最有可能的是,您已禁用该页面的ViewState。
原因是当您执行回发时,转发器中的所有控件都是通过视图状态中的数据重建的。然后,根据控件的ID识别应该接收事件的对象,并路由事件。
如果禁用视图状态,则在回发期间不会重建控制树,因此内存中不存在应该接收事件的控件。事件就这样结束了。
如果你真的想要禁用视图状态,但仍想接收事件,我有一个解决方法(它根本不脏)。我一直在考虑写一篇关于它的博客文章,所以如果你愿意的话,我可以抽出一些时间来完成正常的家务活动并描述它。
修改:此处描述了解决方法:http://petesdotnet.blogspot.dk/2009/08/asp.html
答案 1 :(得分:6)
删除if (!IsPostBack)
,因为这会阻止转发器重新绑定,
并且item命令事件在回发后找不到该行。
答案 2 :(得分:4)
我有同样的问题,除了使用更新面板,我的模态中有一个必需的字段验证器。我发现我的转发器中的LinkButtons触发了requiredFieldValidor事件,然后我在我的转发器的LinkButtons中添加了CausesValidation =“false”。按预期工作。
答案 3 :(得分:2)
当我使用ImageButton时,我在转发器中遇到此问题... 当LinkButton工作时,我在网上搜索此解决方案,但不是ImageButton ......
然后我想,LinkButton工作?所以我会用它:)
<asp:LinkButton CommandName="Filter" CommandArgument='<%# Eval("ID") %>' Text="" runat="server" >
<asp:image imageurl='<%#Eval("Img") %>' runat="server"/>
</asp:LinkButton>
因此,图片位于<A>
标记
玩得开心:)
答案 4 :(得分:1)
我在linkbutton中删除了 PostBackUrl 属性,并触发了ItemCommand。我认为回发首先运行。
答案 5 :(得分:1)
您可能在页面上设置了验证。因此,为链接按钮设置一个新属性,causevaliation =“false”。我相信它会解决问题
答案 6 :(得分:1)
我有一个类似的问题 - 结果是一些谨慎的验证控件在页面的其他位置触发。我花了一天的时间来搞清楚......
答案 7 :(得分:0)
我对此并不乐观,但您可能需要为导致 ItemCommand 事件的按钮设置 CommandName 和可选的 CommandArgument 属性。否则,ASP.NET会假设页面上没有按钮,您希望触发该事件。你可以试试。
另外,如果您没有区分命令名称,为什么不使用每个按钮的Click事件呢?只需订阅转发器的 ItemCreated 或 ItemDataBound 中的那些。
答案 8 :(得分:0)
尝试使用Page_init而不是Page_load,这应该可以解决问题。
答案 9 :(得分:0)
试试这个:
protected void Page_Load(object sender, EventArgs e)
{
SetupPage();
}
如果使用嵌套转发器,则应重新绑定内部转发
答案 10 :(得分:0)
这是您必须在代码中使用的代码..
在PageLoad事件之后,
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Page_LoadComplete(object sender, EventArgs e)
{
// Bind Your Repeater here
rptUser();
}
现在您可以触发您的Itemcommand ..如果您获得输出,请将答案标记为正确,谢谢
答案 11 :(得分:0)
它可能是另一件事(因为它恰好发生在我身上):如果您的数据绑定在您的页面被预呈现时发生,它将不会处理项目命令。将它切换到加载或初始化,你会没事的。