0

我有一个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"
            />

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

  1. 好像跟JS没什么关系——我用 Adblock 在谷歌浏览器中打开页面,一个一个地屏蔽了每个 JS 脚本,什么也没发生
  2. 即使or属性中没有数据绑定表达式,我也无法LinkButton触发该事件。OnRowCommandTextCommandArgument
  3. 我可以在不更改任何其他内容的情况下ButtonField触发该事件。OnRowCommand
  4. 我们有 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. LinkBut​​ton 由于某种原因没有得到第二个参数;2. 第一个参数也不同 - 注意 buttonField 如何以“gvActiveCustomers”结尾,但 LinkBut​​ton 指定“gvActiveCustomers$ct102$ct100”

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

那么,为什么这些论点首先会变得不同呢?

4

1 回答 1

1

诡计问题!(对不起——我可以向你保证这不是故意的)

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

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

由于对于任何可能想将这个问题作为某种谜题来解决的人来说,这是一个完全不令人满意的答案,所以这是我用来找到它的方法:

  • 创建一个单独的简单文件 > 新项目尖峰以确认 GridViews 在我的机器上正确触发了 OnRowCommand。不出所料,这奏效了。

  • 通过创建一个只有网格视图和“它有效”消息 OnRowCommand 的新页面,从应用程序页面本身中删除可能影响 GridView 的所有内容。OnRowCommand 仍然没有触发。

  • 在这一点上,我得出结论,这一定是某种“幽灵般的远距离动作”——即作为系统中的类的 2D Flatlanders 在他们一无所知的三维空间中被一根手指神秘地戳了一下。第一个嫌疑人?网络配置

  • 将 web.config 替换为我之前峰值中完全开箱即用的默认 web.config。值得庆幸的是,这并没有影响整个项目并导致它根本无法运行。同样值得庆幸的是,OnRowCommand 现在会在简单页面上触发!现在我们正在取得进展。

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

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

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

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

于 2013-09-30T17:25:13.537 回答