Asp.net GridView:TemplateField+;LinkButton不会触发RowCommand事件,但ButtonField会触发

Asp.net GridView:TemplateField+;LinkButton不会触发RowCommand事件,但ButtonField会触发,asp.net,gridview,data-binding,webforms,Asp.net,Gridview,Data Binding,Webforms,我有一个GridView和一个TemplateField,其中有一个LinkButton 我的问题是,出于某种原因,此LinkButton不会引发OnRowCommand事件 情节变厚:当我尝试添加按钮字段时,确实会触发OnRowCommand事件(但我不认为我可以使用它,因为我不认为我可以添加数据绑定表达式,例如按钮的文本) 以下是带有链接按钮的列: <asp:TemplateField HeaderText="Customer

我有一个
GridView
和一个
TemplateField
,其中有一个
LinkButton

我的问题是,出于某种原因,此
LinkButton
不会引发
OnRowCommand
事件

情节变厚:当我尝试添加
按钮字段时,确实会触发
OnRowCommand
事件(但我不认为我可以使用它,因为我不认为我可以添加数据绑定表达式,例如按钮的文本)

以下是带有链接按钮的列:

            <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>
<a href="javascript:__doPostBack('ctl00$ctl00$ctl00$theContent$thePageContent2$SubContent3$MyPanel$gvActiveCustomers$ctl02$ctl00','')">1234567890 </a>
因此,这些似乎是相关的事实:

  • 这似乎与JS无关——我用Adblock在Google Chrome中打开了页面,一个接一个地屏蔽了每个JS脚本,但什么都没有发生
  • 即使
    文本
    命令参数
    属性中没有数据绑定表达式,我也无法让
    LinkButton
    触发
    onrow命令
    事件
  • 我可以获取
    ButtonField
    来触发
    onrow命令
    事件,而无需更改任何其他内容
  • 我们有Ektron
  • 这些就是症状。有人有诊断吗

    注意-不是狼疮

    编辑:根据Wiktor非常有用的建议,我检查了客户端输出。对于linkButton,doPostBack()的第二个参数[按钮字段作为命令名]为空。

    所以现在的问题是:这到底是什么空白/

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

    下面是
    按钮字段
    输出的客户机代码(同样,此按钮工作并执行fire onrow命令):

    两个主要区别是: 1.出于某种原因,LinkButton没有得到第二个参数; 2.第一个参数也是不同的-请注意buttonField如何以“gvActiveCustomers”结尾,但LinkButton指定“gvActiveCustomers$ct102$ct100”

    如果我将LinkButton上的参数更改为u doPostBack以匹配Button字段上的参数,LinkButton将启动onRow命令。

    那么,为什么争论首先会变得不同呢?

    这是一个棘手的问题!(对不起-我可以向你保证这不是故意的)

    罪魁祸首原来是一个使用Castle Windsor的依赖项注入模块,看起来与此非常相似

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

    对于任何想把这个问题当作某种谜题来解决的人来说,这是一个完全不令人满意的答案,因此我使用以下方法来找到它:

    • 创建一个单独的简单文件>新建项目spike,以确认GridView在我的机器上正确地启动了onrow命令。毫不奇怪,这起了作用

    • 通过创建一个只包含网格视图和“it worked”消息onrow命令的新页面,从应用程序页面本身中删除可能影响GridView的所有内容。OnRowCommand仍然没有开火

    • 在这一点上,我得出结论,这一定是某种“远处的恐怖行为”——即系统中的2D平地机被他们一无所知的第三维手指神秘地戳了一下。第一个嫌疑犯?web.config

    • 将web.config替换为我之前使用的完全现成的默认web.config。谢天谢地,这并没有拖累整个项目,导致它根本无法运行。同样值得庆幸的是,OnRowCommand现在在这个简单的页面上启动了!现在我们有进展了

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

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

    • 当它开始工作时,您知道问题在于您刚刚注释掉的一个或多个元素。继续平分,直到你找到一条或多条负责的线


    在我们的例子中,它原来是system.webService>modules(前面提到的依赖注入模块)中的一个元素。

    您能检查页面源并找出这些链接按钮的客户端输出吗?使用
    onclick=''doPostback(,,,,
    ?@WiktorZychla-请参见编辑,谢谢你的建议!这肯定揭示了问题的更多本质!真的很奇怪。如果你放任何东西,比如“5”,会怎么样,有吗?@WiktorZychla-请参阅第二次编辑。感谢您的时间和帮助!另一个区别是您为链接按钮提供了明确的ID。我手头没有VS,因此无法验证任何内容,但您是否可以从链接按钮中删除ID?您是指system.WebServer吗?
    <a href="javascript:__doPostBack('ctl00$ctl00$ctl00$theContent$thePageContent2$SubContent3$MyPanel$gvActiveCustomers','viewCustomerDetails$0')">buttonField</a>
    
    <a href="javascript:__doPostBack('ctl00$ctl00$ctl00$theContent$thePageContent2$SubContent3$MyPanel$gvActiveCustomers$ctl02$ctl00','')">1234567890 </a>