ASP.Net转发器项目命令没有被触发

时间:2009-08-24 12:01:52

标签: asp.net repeater itemcommand

好吧,我已经使用了几十次中继器而没有任何问题,但今天出现了一些问题。我有一个转发器,我正在订阅itemCommand事件,但是当我的命令运行时,页面会回发但事件不会被触发。

为了解决这个问题,我必须在每个回发上进行数据绑定。

我的转发器看起来像这样:

<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。一旦被注释掉并且转发器在每个回发上获得数据绑定,它就可以正常工作。我已经在很多其他页面中完成了这个,但就此而言似乎没有用。

其他人遇到过这种行为或有解决方案吗?

12 个答案:

答案 0 :(得分:22)

最有可能的是,您已禁用该页面的ViewState。

原因是当您执行回发时,转发器中的所有控件都是通过视图状态中的数据重建的。然后,根据控件的ID识别应该接收事件的对象,并路由事件。

如果禁用视图状态,则在回发期间不会重建控制树,因此内存中不存在应该接收事件的控件。事件就这样结束了。

如果你真的想要禁用视图状态,但仍想接收事件,我有一个解决方法(它根本不脏)。我一直在考虑写一篇关于它的博客文章,所以如果你愿意的话,我可以抽出一些时间来完成正常的家务活动并描述它。

修改:此处描述了解决方法:http://petesdotnet.blogspot.dk/2009/08/asp.html

答案 1 :(得分:6)

删除if (!IsPostBack),因为这会阻止转发器重新绑定, 并且item命令事件在回发后找不到该行。

答案 2 :(得分:4)

我有同样的问题,除了使用更新面板,我的模态中有一个必需的字段验证器。我发现我的转发器中的LinkBut​​tons触发了requiredFieldValidor事件,然后我在我的转发器的LinkBut​​tons中添加了CausesValidation =“false”。按预期工作。

答案 3 :(得分:2)

当我使用ImageButton时,我在转发器中遇到此问题... 当LinkBut​​ton工作时,我在网上搜索此解决方案,但不是ImageButton ......

然后我想,LinkBut​​ton工作?所以我会用它:)

<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)

它可能是另一件事(因为它恰好发生在我身上):如果您的数据绑定在您的页面被预呈现时发生,它将不会处理项目命令。将它切换到加载或初始化,你会没事的。