Asp .NET HiddenField导致无效的回发或回调参数

时间:2015-09-02 18:54:09

标签: javascript c# asp.net webforms postback

我正在开发一个带有隐藏字段的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();
}

服务器将隐藏字段带来的值存储在Session中,并将其传递给隐藏字段(如果存在):

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

现在我在回发后的随机请求中收到此服务器错误

  

无效的回发或回调参数

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

}

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

ClientScript.GetPostBackEventReference(this, string.Empty);

答案 1 :(得分:0)

所以我会将此作为评论发布,但显然我没有足够的声誉这样做。所以我想我会把它放在这里。首先,我会尝试通过更改if逻辑来清理一些代码。您得到的错误是说Web浏览器中/上的内容与服务器的内容不同,然后它表示这是无效的,并向您传递运行时错误。希望通过改变if逻辑来解决问题。

原因在于,如果你的隐藏值不是null,那么会话仍然是可能的,所以不会发生任何事情,但是如果你改变它,如果你的hiddenfield为null则不会发生任何事情,否则会话将被更新。< / p>

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();
 }

答案 2 :(得分:0)

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