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>