asp.net HiddenField导致无效的回发或回调参数

本文关键字:回调 参数 无效 net HiddenField asp | 更新日期: 2023-09-27 18:10:50

我正在开发一个带有隐藏字段的asp.net web表单,应该有一些值,这个隐藏字段的目的是将值从客户端脚本传递到服务器,以便客户端脚本将值放在此字段中并触发回发:

<asp:HiddenField ID="MyHiddenField" ClientIDMode="Static" runat="server" />
<asp:CheckBox ID="dummy" ClientIDMode="Static" AutoPostBack="true" runat="server" Style="display: none" />

复选框的目的是帮助触发回发:

if ($('#MyHiddenField').val() == '') {
            $('#MyHiddenField').val(SomeValue);
            //do post back:
            $('#dummy').click();
}

服务器在会话中存储来自隐藏字段的值,如果隐藏字段存在,则将其传递给隐藏字段:

if (MyHiddenField.Value != "")
    {
        if (Session["c"] == null)
            Session.Add("c", MyHiddenField.Value);
    }
    else if (Session["c"] != null)
        MyHiddenField.Value = Session["c"].ToString();

现在我在回发后的随机请求中得到这个服务器错误

回发或回调参数无效

堆栈跟踪显示隐藏字段是问题所在:

[ArgumentException:无效的回发或回调参数。]事件验证在配置中启用或在页面中使用<%@ Page EnableEventValidation="true" %>。出于安全目的,此功能验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据是有效且预期的,则使用ClientScriptManager。RegisterForEventValidation方法,以便注册回发或回调数据以进行验证。System.Web.UI.ClientScriptManager。ValidateEvent(字符串唯一id,字符串参数)+144System.Web.UI.Control。ValidateEvent(String uniqueID, String eventArgument) +108System.Web.UI.WebControls.HiddenField。LoadPostData(String postDataKey, NameValueCollection postCollection) +36System.Web.UI.WebControls.HiddenField.System.Web.UI.IPostBackDataHandler。LoadPostData(String postDataKey, NameValueCollection postCollection) +13System.Web.UI.Page。ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +303System.Web.UI.Page。ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1960

隐藏字段是如何导致这个糟糕的回调参数的?为什么我得到这个例外?

asp.net HiddenField导致无效的回发或回调参数

而不是调用一些虚拟控件。你可以调用doPostBack函数

if ($('#MyHiddenField').val() == '') {
        $('#MyHiddenField').val(SomeValue);
        //do post back:
        __doPostBack();

}

在服务器端页面加载方法中添加以下代码

ClientScript.GetPostBackEventReference(this, string.Empty);

所以我会把这个作为评论发布,但显然我没有足够的声誉来这样做。我就把它放在这里吧。首先,我将尝试通过更改if逻辑来清理一些代码。你得到的错误是说什么是在/在web浏览器是不同的,然后服务器有什么,然后它说这是无效的,并传递给你运行时错误。希望通过改变if逻辑可以解决这个问题。

原因是,如果你的隐藏值不为空,会话可能仍然是,所以什么也不会发生,但如果你改变它,像下面一样,当你的隐藏字段为空时,什么也不会发生,否则会话将被更新。

if (MyHiddenField.Value != "")
 {
    if (Session["c"] == null)
       Session.Add("c", MyHiddenField.Value);
 }
 else if (Session["c"] != null)
   MyHiddenField.Value = Session["c"].ToString();
if(Session["c"] == null)
   Session.Add("c",MyHiddenField.Value);
else if(MyHiddenField.Value != "")
 {
   MyHiddenField.Value = Session["c"].ToString();
 }

实际上我发现了这个问题,它可能对其他人有用,问题是我在页面完全加载之前触发回发,等待页面加载修复问题