现在的位置: 首页 > 综合 > 正文

关于回发或回调参数无效问题原因的浅析

2012年11月25日 ⁄ 综合 ⁄ 共 1988字 ⁄ 字号 评论关闭

     这个问题出现了多次,有很多次莫名其妙的出现,又莫名其妙的消失,上网搜索说是两种情况

     1、Form嵌套,一个页面只能有一个Form,仔细检查代码就可以解决。
     2、在下拉菜单中使用ajax,常见于联动菜单,可能是由于在aspx页面赋给了下拉菜单初始Item值,在事件回发时提示该错误,将下拉菜单初始Item值删除,在绑定事件中添加Item项。

但是我遇到到的都不是这样。

     第一次是同事出现的:在页面有Gridview控件,同时调用了Gridview的单列触发的Edit事件。而数据邦定的Databind每次都在进行。我的理解是当Editt事件触发以后Client向后台返回了Gridview的相关数据,但是我同事直接在处理Edit事件之前又对数据显示控件进行了绑定(Databind写在Page_load中,又没有加If(!Postack)),这样显然是不符合逻辑的。后来把Databind重构并放在(If !Postback)后问题解决。

     当时因为出错怪异,没有去想代码本身的逻辑问题。搜索这个问题很多回答添加<%@ Page EnableEventValidation=”false” %>来解决。事实上如果添加了这个会导致页面DataGrid相应的事件没有任何值回传。虽然不再报错,但有因噎废食之嫌。

     第二次是我用AjaxToolKit对联动菜单进行初始化,也与网上叙述的问题不一样。当所有的菜单都初始化以后点生成相应的水晶报表以后报错。解决方法是加上了<%@ Page EnableEventValidation=”false” %>

     网上有说法改掉DropdownList为Html Select服务器控件来解决问题。对于AjaxToolKit后台有固定的OverRidde方法来对Dropdowlist控件进行相关的初始化,如果改成Select当然不符合要求了。

 

     不过综合其他现象和相关解决办法我猜想问题出现的根源在于Asp.net对来自Client的请求有事件验证。即由Server出去的页面在Server 这边是有注册的,而注册的形式则是原来Form里面的元素都有登记,所以当Form发生改变之后就会被事件验证发现与原来注册的Form有区别就会阻止,这样能够防止非法的虚拟探测。

        Web系统毕竟是HTML,Asp.net也不例外,只是加了一层华丽的外表而已。对最原始的Html form的Post,Get进行了相应的包装,DropdownList到了页面上还得还原成Select,DataGridView还原成Form Table,TextBox还原成input……通过附带Cs文件以及其他Server端的方式达到MVC 的模型,成为我们所见到的PageLoad,ButtonClick,GridViewEditing等方法,实际上只是有很多繁琐的转换由Asp.net 处理了而已,但终究万变不离其中。一个通过浏览器得到的Aspx文件和JSP,Html文件本身没有本质的区别,都是一串Html代码而已。之所以不能进行不能进行或者很难进行一个Jsp的form不能直接提交到一个Aspx的后台处理。而Asp.net相应增加的一些处理如果没有引起注意,则会引起很多的莫名错误。

      所以对我出现的第一个问题,在GridviewEdit事件方法处理数据之前,Server端对过来的Form进行了验证,发现不一样(在PageLoad方法中重新DataBind了),所以报错。第二个问题则是本来Dropdownlist本来由Server端到Client端是没有数据的,后来经页面的JavaScript改变以后,相应的Server端注册却没有改变,所以报错。

      如果没有<%@ Page EnableEventValidation=”false” %>,会去除Asp.net的验证,同时相应的方法失效。(试想如果后台CS文件本来做好了准备去处理一个FORM里面100%确定存在的Textinput控件却被人为的去掉了,会造成多少空指针的错误啊)。如果CS文件每次调用自己的页面文件上的控件都需要去验证它的有无则会大大增加代码量和Bug风险。所以Microsoft代做了这一步。当然,并不是每个地方都会验证,从目前的情况看是相应的可以数据绑定的控件都有。所以对Dropdownlist,DataGridView等控件在客户端通过JavaScript改变了对应的Select,Form Table以及在相应事件方法触发前改变了其原本不可改变的内容的都会出现错误。

      留下一个问题,如果我的页面确实需要用Ajax来初始化相应的联动下拉列表,同时页面上又有DataGridview控件的事件方法需要使用怎么办?下次有时间再解决

抱歉!评论已关闭.