ajax省市联动 回发或回调参数无效 启用了事件验证。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ajax省市联动 回发或回调参数无效 启用了事件验证。相关的知识,希望对你有一定的参考价值。

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

网上看了些方法都没有解决问题 我把源代码放到这个邮箱大家看看
ccc-net@163.com cccnet 密码不要改动哦

问题解决追加100 谢谢了
EnableEventValidation="true" 改了false只是出了错误忽略了,百度一下到处都是 也不用这样敷衍吧

你可以加一个hidden存放DropDownList2选中的值,然后把DropDownList2清空就可以正常提交了,代码如下

.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"

    EnableEventValidation="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>省市无刷新二级联动</title>

</head>

<body>

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

    <div>

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

        </asp:DropDownList>

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

        </asp:DropDownList>

    </div>

    <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="Button_Submit()"

        OnClick="Button1_Click" />

    <input id="City" type="hidden" runat="server" />

    </form>

</body>

<script language="javascript" type="text/javascript">

    var http_request;

    function send_request() 

        if (window.XMLHttpRequest) 

            http_request = new XMLHttpRequest();

        

        else if (window.ActiveXObject) 

            http_request = new ActiveXObject("Microsoft.XMLHTTP");

        

        http_request.onreadystatechange = function Getcity() 

            if (http_request.readyState == 4 && http_request.status == 200) 

                if (http_request.responseText != "") 

                    var myarr = new Array(25);

                    var ResponseText = http_request.responseText;

                    var pos = ResponseText.indexOf(";");

                    var i = 0;

                    while (pos != -1) 

                        var myText = ResponseText.substring(0, pos);

                        if (myText != "") 

                            myarr[i] = myText;

                            i++;

                        

                        ResponseText = ResponseText.substr(pos + 1);

                        pos = ResponseText.indexOf(";");

                        continue;

                    

                    for (var n = 0; n < i; n++) 

                        document.getElementById("DropDownList2").options[n] = new Option(myarr[n], "");

                        document.getElementById("DropDownList2").length = n + 1;

                    

                

            

        ;

        //创建htpp请求

        //open方法表示打开一个URL连接

        http_request.open("get", "GetCity.ashx?ProvinceType=" + document.getElementById('DropDownList1').value, true);

        //发送上面创建的http请求

        http_request.send(null);

    

    function Button_Submit() 

        document.getElementById('City').value = document.getElementById('DropDownList2').options[document.getElementById('DropDownList2').selectedIndex].innerText;

        document.getElementById('DropDownList2').length = null;

    

</script>

</html>

.cs

using System;

using System.Configuration;

using System.Data;

using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)

    

        if (!Page.IsPostBack)

        

            ProDtaBind();

            this.DropDownList1.Attributes.Add("onchange", "send_request()");

        

    

    private void ProDtaBind()

    

        SqlConnection sqlconn = new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"].ToString());

        SqlDataAdapter sda1 = new SqlDataAdapter("select * from province", sqlconn);

        SqlDataAdapter sda2 = new SqlDataAdapter("select * from city where proID=1", sqlconn);

        DataSet myds1 = new DataSet();

        sda1.Fill(myds1, "a");

        sda2.Fill(myds1, "b");

        this.DropDownList1.DataSource = myds1.Tables[0];

        this.DropDownList1.DataTextField = "proName";

        this.DropDownList1.DataValueField = "proID";

        this.DropDownList1.DataBind();

        this.DropDownList2.DataSource = myds1.Tables[1];

        this.DropDownList2.DataTextField = "cityName";

        this.DropDownList2.DataValueField = "cityID";

        this.DropDownList2.DataBind();

    

    protected void Button1_Click(object sender, EventArgs e)

    

        using (SqlConnection sqlconn = new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"].ToString()))

        

            using (SqlDataAdapter sda2 = new SqlDataAdapter("select * from city where proID=" + DropDownList1.SelectedValue, sqlconn))

            

                DataSet myds1 = new DataSet();

                sda2.Fill(myds1, "b");

                this.DropDownList2.DataSource = myds1.Tables[0];

                this.DropDownList2.DataTextField = "cityName";

                this.DropDownList2.DataValueField = "cityID";

                this.DropDownList2.DataBind();

                this.DropDownList2.SelectedItem.Text = City.Value;

            

        

        Response.Write(DropDownList1.SelectedItem.Text);

        Response.Write(City.Value);

    

参考技术A 你自己能确定是不是因为AJAX发起请求后,处理页面则认为是无效来源而造成无法正常回发呀,你可以在你的处理页面验证一下,打印出来看一下的呀,你要一步步去确定问题出在哪才能找到解决办法的呀, 参考技术B <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableEventValidation="true" %>

这里把EnableEventValidation="true"改成EnableEventValidation="false"就不会报错了

弗尤博客

System.ArgumentException: 回发或回调参数无效。在配置中使用 < pages enableEventValidation="true"/>

关于在同一个页面中使用Gridview控件的时候发现气updaeting事件无法被服务器所响应,看来它的错误报警然后查询了部分资料现在将整理的解决方法总结如下:点击update 事件无法响应原因出在回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回 调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。


说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
         异常详细信息: System.ArgumentException: 回发或回调参数无效。在配置中使用 < pages enableEventValidation="true"/> 或在页面中使用 <% @ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数 是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。

 看了半天也没发现是什么问题,检查了一遍代码也是对的,页面所有控件的ID,属性都检查了还是没找到问题。后来才发现是这么回事:

发生条件:

1.画面有隐藏控件。

2.多次的Gridview绑定。

3.多个Form中嵌套使用。

发生原因:

.NET基于页面中的输出元素会在最终页面中生成一个__EVENTVALIDATION隐藏字段。做了一个简单的测试。页面中创建一个<asp: button id="btnSubmit" runat="server" text="Submit" tooltip="Submit" />,同时创建对应的Click事件处理程序。运行程序,可以正确响应事件。然后设置btnSubmit.Visable=false,手动在页面 上面添加<input type="submit" name="btnSubmit" value="Submit" />。运行程序,会出现一个包含EnableEventValidation内容的异常。设置<@Page EnableEventValidation="false">再运行程序,又可以正确响应事件。观察前后两次__EVENTVALIDATION 的内容,可以发现是不同的。关于出现的异常,可以认为在输出的时候没有包含btnSubmit,可是再提交到后台的时候却有相应的内容,前后不一致,所以 在开启事件校验的情况下.NET抛出了异常。

 解决办法1:
Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //绑定数据;
    }
}
解决办法2:
<pages enableEventValidation="false"/>

1、在页面的<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 中添加 EnableEventValidation="false" 就可以了。(首先考虑的)

2、通过web.config 
<system.web> 
<pages enableEventValidation="false"/> 

3、是Form嵌套,一个页面只能有一个Form,仔细检查代码就可以解决。 

4、如果页面含有 DropDownList 或 ListBox这样的控件,可能以下原因造成: 

4.1 在下拉菜单中使用ajax,常见于省市联动菜单,可能是由于在aspx页面赋给了下拉菜单初始Item值,在事件回发时提示该错误,将下拉菜单初始Item值删除,在绑定事件中添加Item项。
4.2 原因是 DropDownList 控件的ListItem 的Value 属性 包含汉字.只要将Value 改为英文或数字的就行了.最好在web.config中添加如下语句:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>因为 POSTBACK 如果不采用 UTF-8 编码, JAVASCRIPT 会认为有问题。
只改 requestEncoding="utf-8" 就可以了,responseEncoding="utf-8" 不用 

5.Register For Event Validation 
其原理就是让asp.net记录这个postback value. 

RegisterForEventValidation必须在render时调用.

获取datalist中控件两种情况

如果在当前行点击按钮时候,获取当前行的textbox内容,如下:
button1——Click中
DataListItem item=(DataListItem)((Button)sender).NamingContainer;
TextBox txt= item.FindControl("TextBox1") as TextBox
//在page_load中:
if(!IsPostBack)
{
  //绑定datalist
}
//在获取textbox值时候,如果要获取所有textbox值,遍历
public partial class _Default : System.Web.UI.Page
{
  //后台代码取值事件
  protected void ........(....)
  {
  foreach(DataListItem item in DataList1.Items)
  {
  TextBox txt= item.FindControl("TextBox1") as TextBox
  this.product = txt.Text;
  }
  }
}

 参考链接:

https://blog.csdn.net/dongge825/article/details/7868151

https://blog.csdn.net/dickens88/article/details/6663230































以上是关于ajax省市联动 回发或回调参数无效 启用了事件验证。的主要内容,如果未能解决你的问题,请参考以下文章

Sys.WebForms.PageRequestManagerServerErrorException:无效的回发或回调参数

无效的回发或回调参数/无效的视图状态

asp.net:无效的回发或回调参数

弗尤博客

第117天:Ajax实现省市区三级联动

调用按钮单击gridview内的文件上传