2011-11-14 33 views
0

私は項目を上下にシフトする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; 
     } 

エラーメッセージ:

無効なポストバックまたはコールバック引数。イベントの検証は、in構成または<%@ Page EnableEventValidation = "true"%>を使用して有効になっています。セキュリティ上の理由から、この機能はポストバックまたはコールバックイベントの引数が元々レンダリングされたサーバーコントロールから発生することを確認します。データが有効で予期されている場合は、検証のためにポストバックまたはコールバックデータを登録するためにClientScriptManager.RegisterForEventValidationメソッドを使用します。

答えて

1

これは、ページの送信時にリストボックスに新しいアイテムが選択されているためです。 ASP.NETがページをレンダリングするとき、ListBoxにレンダリングされているアイテムが表示され、選択した値がポストバックされていない場合は、データが改ざんされたと見なしてエラーがスローされます。

ページ全体でEventValidationを無効にすることができます(エラーの説明を参照してください)。しかし、これは多くの保護を無効にするため、コードを徹底的に熟読しない限り、一般的に悪いことです。

残念ながら、1つのコントロールに対してEventValidationを完全に無効にすることはできません。 ClientScriptManager.RegisterForEventValidationを使用することができますが、これにはASP.NET すべてにと入力する必要があります。

周囲の道は、あなたと同じような隠しフィールドを使用していますが、選択したアイテムのためです。隠しフィールドを使用して、リストボックスで選択したオプションを返信し、のリストボックスの選択をポストバックの直前にクリアして、ASP.NETが認識できない値に不平を言うことがないようにしてください。

関連する問題