我有一个GridView
,TemplateField
位于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"
/>
所以这些似乎是相关的事实:
LinkButton
或OnRowCommand
属性中没有数据绑定表达式,我也无法Text
触发CommandArgument
事件。ButtonField
触发OnRowCommand
事件而不更改任何其他内容。所以这些都是症状。有人有诊断吗?
P.S。 - 它不是狼疮。
编辑:根据Wiktor的非常有用的建议,我检查了客户端输出。对于linkButton,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.由于某种原因,LinkButton没有获得第二个参数; 2.第一个参数也不同 - 请注意buttonField如何结束“gvActiveCustomers”,但LinkButton指定“gvActiveCustomers $ ct102 $ ct100”
如果我将LinkButton上的参数更改为__doPostBack以匹配ButtonField上的参数,则LinkButton会触发OnRowCommand。
那么为什么争论首先会有所不同呢?
答案 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;中的一个元素。模块(上述依赖注入模块)。