GridView:TemplateField + LinkBut​​ton不会触发RowCommand事件,但会触发ButtonField

时间:2013-09-16 19:47:41

标签: asp.net gridview data-binding webforms

我有一个GridViewTemplateField位于LinkButton

我的问题是,由于某种原因,此LinkButton不会导致OnRowCommand事件触发。

情节变浓:当我通过添加ButtonField进行实验时,触发OnRowCommand事件(但我不认为我可以使用它,因为我没有我想我可以添加数据绑定表达式,例如按钮的文本。)

以下是包含LinkButton

的列
            <asp:TemplateField     
            HeaderText="Customer #:"
            SortExpression="custNumber"
            HeaderStyle-Width="8em">                               
             <ItemTemplate>
                 <asp:LinkButton runat="server"                                
                    Text='<%#DataBinder.Eval(Container.DataItem, "custNumber")%>' 
                    CommandName="viewCustomerDetails"
                    CommandArgument='<%#DataBinder.Eval(Container.DataItem, "custNumber")%>'></asp:LinkButton>
            </ItemTemplate>                     
            </asp:TemplateField>

这里的复杂性是ButtonField

                <asp:ButtonField
            Text="buttonField"
            CommandName="viewCustomerDetails"
            />

所以这些似乎是相关的事实:

  1. 似乎与JS有任何关系 - 我在Google Chrome中使用Adblock打开了该页面,并且逐个阻止了每个JS脚本,没有发生任何事情
  2. 即使LinkButtonOnRowCommand属性中没有数据绑定表达式,我也无法Text触发CommandArgument事件。
  3. 我可以ButtonField触发OnRowCommand事件而不更改任何其他内容。
  4. 我们有Ektron。
  5. 所以这些都是症状。有人有诊断吗?

    P.S。 - 它不是狼疮。

    编辑:根据Wiktor的非常有用的建议,我检查了客户端输出。对于linkBut​​ton,doPostBack()[ButtonField作为命令名称]的第二个参数是BLANK。

    所以现在问题变成了:为什么这个空白呢? :/

    编辑第二个:似乎第一个参数也略有不同。

    以下是ButtonField输出的客户端代码(同样,这个工作并触发OnRowCommand):

    <a href="javascript:__doPostBack('ctl00$ctl00$ctl00$theContent$thePageContent2$SubContent3$MyPanel$gvActiveCustomers','viewCustomerDetails$0')">buttonField</a>
    

    现在这里是LinkButton输出的客户端代码:

    <a href="javascript:__doPostBack('ctl00$ctl00$ctl00$theContent$thePageContent2$SubContent3$MyPanel$gvActiveCustomers$ctl02$ctl00','')">1234567890 </a>
    

    两个主要区别: 1.由于某种原因,LinkBut​​ton没有获得第二个参数; 2.第一个参数也不同 - 请注意buttonField如何结束“gvActiveCustomers”,但LinkBut​​ton指定“gvActiveCustomers $ ct102 $ ct100”

    如果我将LinkBut​​ton上的参数更改为__doPostBack以匹配ButtonField上的参数,则LinkBut​​ton会触发OnRowCommand。

    那么为什么争论首先会有所不同呢?

1 个答案:

答案 0 :(得分:1)

欺骗问题! (对不起 - 我可以向你保证,这不是意图

罪魁祸首是使用Castle Windsor的依赖注入模块,看起来非常类似于How to use Castle Windsor with ASP.Net web forms?

正如您从原始问题的评价很高的评论中看到的那样,代码会在每个请求中清除ViewState。 (“那就是你的问题!”)

由于对于那些可能想要将这个问题解决为各种难题的人来说,这是一个完全不满意的答案,这里是我用来找到它的方法:

  • 创建单独的简单文件&gt;新项目高峰确认GridViews正在我的机器上正常启动OnRowCommand。不出所料,这很有效。

  • 通过创建一个除了网格视图和“工作”消息OnRowCommand之外的新页面,从应用程序页面本身中删除可能影响GridView的所有。 OnRowCommand仍然没有开火。

  • 在这一点上,我得出结论,它必须是某种“远距离的怪异行为” - 即系统中的类2D平地移动器被第三维中的手指神秘地刺穿了他们什么都不知道。第一个怀疑?的web.config

  • 将web.config替换为我之前的spike中完全开箱即用的默认web.config。值得庆幸的是,这并没有影响整个项目,导致它根本不运行。还要幸运的是,OnRowCommand现在在简单的页面上触发! 现在我们到了某个地方。

  • 所以我们知道它是web.config中的东西。放回原始(非工作)web.config。现在尝试一些二分法,这样我们就可以尽可能地消除系统的每次运行。注释掉system.web元素的前半部分,仍然有效。下半场评论,仍然有效。所以我们知道它不在system.web ...

  • 泡沫,冲洗,重复,直到我们在简单的页面上运行测试它开始工作。

  • 当它开始工作时,您知道问题在于您刚刚注释掉的一个或多个元素。保持二等分,直到找到相应的一行或多行。

在我们的案例中,它原来是system.webService&gt;中的一个元素。模块(上述依赖注入模块)。