asp.net回发或回调参数无效,原因分析与解决方案

  1.     <form id="form1" runat="server">
  2.     <div>
  3.         <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 
  4.         <asp:DropDownList ID="DropDownList1" runat="server">
  5.             <asp:ListItem Value="测试1a">测试1</asp:ListItem>
  6.             <asp:ListItem Value="测试2a">测试2</asp:ListItem>
  7.             <asp:ListItem Value="测试3a">测试3</asp:ListItem>
  8.             <asp:ListItem Value="测试4a">测试4</asp:ListItem>
  9.         </asp:DropDownList></div>        
  10.     </form>
  11. </body>
  12. </html>
  13. <script>
  14.         var opt=document.createElement("OPTION");
  15.         opt.text="测试5"
  16.         opt.value="测试5a";
  17.         document.getElementById("DropDownList1").options.add(opt);      
  18. </script>

 

  1.     protected override void Render(HtmlTextWriter writer)
  2.     {
  3.         this.Page.ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "测试5a");
  4.         base.Render(writer);
  5.     }

回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。

 

1.将<pages enableEventValidation="true"/>改为<pages enableEventValidation="false"/>,

可以取得其值, 按不安全,Response.Write(Request.Form[this.DropDownList1.UniqueID]);

 

2.使用RegisterForEventValidation注册客户端控件的值。

 

原因是__EVENTVALIDATION

 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBwLM/LTzBALq+IGyBAKM54rGBgKHuozFBgKoo67QDALN1LCvCgL2/dI6Phwzxx9n0hTbQF6gEBTRfJDUq6s=" />

 

加这句后变成  this.Page.ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "测试5a");

 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBgLM/LTzBAKM54rGBgKHuozFBgKoo67QDALN1LCvCgL2/dI6FKmWW61n11M+j7rWRIQmLBGT/ow=" />

 

原理:基于安全原因,EVENTVALIDATION是当前一些控件中的值按一定算法后(MAC加密+base64)存放入客户端的数据。下次上传时再依据页面中的控件(viewState)经过该算法,如果结果不相等,则视为不安全数据,而DropDownList1恰恰是该算法需求进行安全验证的控件之一????

 

原理:基于安全原因,检查上传的值是否存在于EVENTVALIDATION中,如果不存在,则视为不安全.??

 

 

采用js在客户端增加数据后,不是很好的支持服务端的语句了.

this.DropDownList1.SelectedValue;
this.DropDownList1.SelectedIndex;

当然你可以使用自已采用JS来改变SelectedIndex;也可以再在服务端重新再添加一次服务端控件集.

 

所以这个控件DropDownList的不能很好的支持JS,

1.可以采用asp.net Ajax达到级联DropDownList,(下载数据量小)

2.全部改用传统的html控件的方式.可以全部使用js做级联.在有些应用中这样比Aajx的方式更省资源. 

3.采用逆向思维,服务端的使用全部相同,客户端采用js来控件js的显示即可,

具体做法是:

1)服务绑只需绑定所以数据,

2)输出js,所以按级联系输出,js格式,xml格式都可以

3)客户端采用js,全部remove,

4)按级联关系,按级联关系重新加载数据,控制显示与hidden

好处:服务端是服务端,可以不管级联关系,采用服务端的api,客户端采用js,控件显示与hidden

  1. <body>
  2.     <form id="form1" runat="server">
  3.     <div>
  4.         <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />  <select id="Select1" runat="server">
  5.             <option value="1">1</option>
  6.             <option value="2">2</option>
  7.             <option value="3">3</option>
  8.             <option value="4">4</option>
  9.         </select>
  10.     </div>        
  11.     </form>
  12. </body>
  13. </html>
  14. <script>
  15.         var opt=document.createElement("OPTION");
  16.         opt.text="测试5"
  17.         opt.value="测试5a";
  18.         var opt1=document.getElementById("Select1").options[3];
  19.         document.getElementById("Select1").options.remove(3);
  20.         document.getElementById("Select1").options.add(opt1);
  21.                 
  22. </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值