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

时间:2011-11-14 08:59:22

标签: javascript asp.net

我有一个列表框,其中有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;
        }

错误讯息:

无效的回发或回调参数。使用配置或&lt;%@ Page EnableEventValidation =“true”%&gt;启用事件验证在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

1 个答案:

答案 0 :(得分:1)

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

您可以为整个页面禁用EventValidation(如错误中所述),但这通常是不好的做法,除非您对代码非常彻底,因为它会禁用大量的保护。

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

一种解决方法是使用类似于你的隐藏字段,但是对于所选项目。尝试使用隐藏字段发回列表框中的选定选项,并记住在回发之前清除ListBox中的选择,以便ASP.NET不会抱怨无法识别的值。