Javascript 列表框项目移动+;回发或回调参数无效

Javascript 列表框项目移动+;回发或回调参数无效,javascript,asp.net,Javascript,Asp.net,我有一个列表框,它有两个按钮来上下移动其中的项目。如果这些项目是事先绑定好的,如果我移动它们的位置并将其保存到我的数据库中就可以了,但是如果我要从文本框中添加一个新项目-->向上或向下移动其位置-->保存我的表单,我将得到如下所示的错误,敬请告知,我不想关闭安全功能。谢谢: 这是我在JS中的上移代码: function moveUp() { // get the list box var lb = document.getElem

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

这是我在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;
        }
函数moveUp(){
//获取列表框
var lb=document.getElementById(“”);
//如果少于2项,则忽略它
如果(磅长度<2)返回false;
//如果选择了第一个项目,则表示它无法再向上移动,因此忽略它
if(lb.options[0].选中)返回false;
var tempOpt;
对于(i=1;i
错误消息:


回发或回调参数无效。在配置或页面中使用启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合要求,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

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

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

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

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