我有一个GridView
带有 aTemplateField
的 a LinkButton
。
我的问题是,由于某种原因,这LinkButton
不会导致OnRowCommand
事件触发。
情节变厚了:当我通过添加 a 进行实验时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"
/>
所以这些似乎是相关的事实:
- 好像跟JS没什么关系——我用 Adblock 在谷歌浏览器中打开页面,一个一个地屏蔽了每个 JS 脚本,什么也没发生
- 即使or属性中没有数据绑定表达式,我也无法
LinkButton
触发该事件。OnRowCommand
Text
CommandArgument
- 我可以在不更改任何其他内容的情况下
ButtonField
触发该事件。OnRowCommand
- 我们有 Ektron。
所以这些就是症状。有人有诊断吗?
PS - 这不是狼疮。
编辑:根据 Wiktor 非常有用的建议,我检查了客户端输出。对于链接按钮,doPostBack() 的第二个参数 [ButtonField 作为命令名称] 是空白。
所以现在问题变成了:为什么这个地方是空白的?:/
编辑第二个:似乎第一个参数也略有不同。
这是客户端代码输出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. LinkButton 由于某种原因没有得到第二个参数;2. 第一个参数也不同 - 注意 buttonField 如何以“gvActiveCustomers”结尾,但 LinkButton 指定“gvActiveCustomers$ct102$ct100”
如果我将 LinkButton 上的参数更改为 __doPostBack 以匹配 ButtonField 上的参数,则 LinkButton 会触发 OnRowCommand。
那么,为什么这些论点首先会变得不同呢?