您的位置:首页 > 编程语言 > ASP

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

2008-10-31 16:58 459 查看
<form id="form1" runat="server">

<div>

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

<asp:DropDownList ID="DropDownList1" runat="server">

<asp:ListItem Value="测试1a">测试1</asp:ListItem>

<asp:ListItem Value="测试2a">测试2</asp:ListItem>

<asp:ListItem Value="测试3a">测试3</asp:ListItem>

<asp:ListItem Value="测试4a">测试4</asp:ListItem>

</asp:DropDownList></div>

</form>

</body>

</html>

<script>

var opt=document.createElement("OPTION");

opt.text="测试5"

opt.value="测试5a";

document.getElementById("DropDownList1").options.add(opt);

</script>

protected override void Render(HtmlTextWriter writer)

{

this.Page.ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "测试5a");

base.Render(writer);

}

回发或回调参数无效。在配置中使用 <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

<body>

<form id="form1" runat="server">

<div>

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> <select id="Select1" runat="server">

<option value="1">1</option>

<option value="2">2</option>

<option value="3">3</option>

<option value="4">4</option>

</select>

</div>

</form>

</body>

</html>

<script>

var opt=document.createElement("OPTION");

opt.text="测试5"

opt.value="测试5a";

var opt1=document.getElementById("Select1").options[3];

document.getElementById("Select1").options.remove(3);

document.getElementById("Select1").options.add(opt1);

</script>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: