繁体   English   中英

列表框项目转移+无效的回发或回调参数

[英]Listbox item shifting + Invalid postback or callback argument

我有一个列表框,其中有2个按钮可以上下移动其中的项目。 如果这些项目是预先绑定的,那么如果我将它们的位置移动并保存到数据库中就可以了,但是如果我要从文本框中添加新项目->向上或向下移动其位置->保存在我的表单中,我将收到如下所示的错误,请您指教,我不想关闭安全功能。 谢谢:

这是我在JS中上移的代码:

        function moveUp() {

            // get the list box
            var lb = document.getElementById("<%=uilstMemTypeTier.ClientID%>");

            // if there are less than 2 items ignore it
            if (lb.length < 2) return false;

            // if the first item is selected it means that it cannot move up anymore so ignore it
            if (lb.options[0].selected) return false;

            var tempOpt;
            for (i = 1; i < lb.length; i++) {
                if (lb.options[i].selected) {
                    // remove the previous option and put it in a temp var
                    tempOpt = new Option(lb.options[i - 1].value, lb.options[i - 1].value);
                    // push the current one back one
                    lb.options[i - 1] = new Option(lb.options[i].value, lb.options[i].value);
                    lb.options[i - 1].selected = true;
                    // push the previous one into the current space
                    lb.options[i] = tempOpt;
                }
            }

            repopulateHiddenFieldDefaultsFromListBox();
            repopulateHiddenFieldListItemsFromListBox();
        }

         function repopulateHiddenFieldDefaultsFromListBox() {
            // get the list box
            var lb = document.getElementById("<%=uilstMemTypeTier.ClientID%>");

            // get the hidden field
            var hf = document.getElementById("<%=hf_listBasedFields_defaultItems.ClientID%>");

            for (i = 0; i < lb.length; i++) {
                if (lb.options[i].selected) hf.value += lb.options[i].value + delim;
            }
        }

        function repopulateHiddenFieldListItemsFromListBox() {
            // get the list box
            var lb = document.getElementById("<%=uilstMemTypeTier.ClientID%>");

            // get the hidden field
            var hf = document.getElementById("<%=uihdnlistBasedFieldsListItems.ClientID%>");

            // loop thru the list box and repopulate the hf
            hf.value = "";
            for (i = 0; i < lb.length; i++) hf.value += lb.options[i].value + delim;
        }

错误信息:

无效的回发或回调参数。 使用配置或页面中的<%@页面EnableEventValidation =“ true”%>启用事件验证。 为了安全起见,此功能验证回发或回调事件的参数源自最初呈现它们的服务器控件。 如果数据有效且预期,请使用ClientScriptManager.RegisterForEventValidation方法以注册回发或回调数据以进行验证。

这是因为提交页面时在列表框中选择了一个新项目。 当ASP.NET呈现页面时,它会记录它在ListBox中呈现的项目,并且如果选择的值不是其中之一,则在回发时会抛出该错误,因为它认为数据已被篡改。

您可以为整个页面禁用EventValidation(如错误中所述),但这通常是一种不好的做法,除非您对代码非常了解,因为它会禁用由此带来的许多保护。

不幸的是,我认为您不能只为一个控件完全禁用EventValidation。 您可以使用ClientScriptManager.RegisterForEventValidation但这要求您告诉ASP.NET 所有可能输入的值。

解决该问题的一种方法是使用与您的状态类似的隐藏字段,但要使用所选项目。 尝试使用隐藏字段将列表框中的选定选项发送回去,并记住在回发之前清除列表框中的选择,以使ASP.NET不会抱怨无法识别的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM