ASP.Netでクライアントに多くのチェックボックスを送信する最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/235608

質問

次の状況があります:

ユーザーはページで特定のフィルターを定義し、ポストバックでそのフィルターを使用してデータベースにクエリを実行し、それぞれに横にチェックボックスがある一致するレコードの束を返します。それらの各レコードを処理します。

クラシックASP / PHPでは、<!> quot; chk __ * <!> quotという名前の多くのコントロールを生成できます。そして、ポストバックで、すべての$ POSTエントリを調べて、プレフィックス<!> quot; chk <!> quot;を探します。

ASP.Net 2.0でこれを行う最良の方法は何ですか?

チェックボックスを含むテンプレートを使用してリピーターを実装し、リピーターをデータセットにバインドしてから2番目のポストバックで簡単に実行できます。

For Each it As RepeaterItem In repContacts.Items
    Dim chkTemp As CheckBox = DirectCast(it.FindControl("cbSelect"), CheckBox)
    If chkTemp.Checked Then

    End If
Next

ただし、これには巨大なビューステートを提供するわずかの欠点があります。安っぽい接続で私のサイト。

他のアイデアはありますか? (コントロールを動的に作成し、昔のようにRequest.Formを反復処理することもできますが、よりクリーンなものを探していました

役に立ちましたか?

解決

従来のASPで行ったのと同じ方法で行います。 <!> lt; input type = <!> quot; checkbox <!> quot; <!> gt;を使用します<!> lt; asp:checkbox <!> gt;の代わりに。 Request.Form

を使用して、未加工のポストパラメーターにアクセスできます。

他のヒント

CheckBoxListコントロールを見ましたか?これをデータセットにバインドし、テキストメンバーと値メンバーのアイテムを提供できます。また、どのアイテムがチェックされているかを簡単に確認できます。必要に応じて動的にチェックボックス項目を追加する機能もあります。

Viewstateの不条理な状況に直面したときは、クラシックASPソリューションをお勧めします。それが提供する素晴らしい機能を失うのは悲しいですが、一部のビューステート対応コントロール(asp:*)をいくつかの古典的なテクニック(input type = <!> quot; ... <!> quot; )過去にたくさんの頭痛の種を救ってくれました。

単純なことをしたい場合があり、単純な解決策は<!> quot; WYSIWYG <!> quot;に勝ります。フォームの編集。

私がやったことの1つは、セッションのAJAXを介してチェックの状態を記録し、ポストバック(AJAXを介して完全または部分的に)で、選択されたアクションを実行するアイテムのセッションを調べることです。

基本的な考え方は、関連付けられたアイテムのIDを知っているチェックボックスにonclickハンドラーを追加することです。 on clickハンドラーで、このIDをAJAX経由でサーバーに返し、セッションに記録します。アイテムのチェックを外すことができるように、チェックボックスのステータスも通知する必要があります。送信コントロールのハンドラーに、セッションから選択されたアイテムに関するデータを使用させる。

この方法では、ページ上のデータも処理できます。チェックされたアイテムを含むページを(完全または部分的に)レンダリングするときにセッションからチェックボックスの初期値を設定できるためです。

このように見えるかもしれません。 PageMethods(およびもちろんScriptManager)でASP.NET AJAXを想定しています。

<script type='text/javascript'>
   function record(checkbox,item)
   {
       var context = { ctl : checkbox };
       PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context);
   }

   function onSuccess(result,context)
   {
      // do something, maybe highlight the row, maybe nothing
   }

   function onFailure(error,context)
   {
       context.ctl.checked = false;
       alert(error.get_Message());
   }
</script>


...
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr>
...

Codebehind

[WebMethod(EnableSessionState=true)]
public static void Record( string itemName, bool value )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList == null)
     {
        itemList = new List<string>();
        Session["Items"] = itemList;
     }
     if (itemList.Contains(itemName) && !value)
     {
         itemList.Remove(itemName);
     }
     else if (!itemList.Contains(itemName) && value)
     {
         itemList.Add(itemName);
     }       
}

protected void button_OnClick( object sender, EventArgs e )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList != null)
     {
         foreach (string item in itemList)
         {
             // do something with the selected item
         }
     }
}

ViewStateを無効にします。できない場合は、セッションを使用して、ビューステート

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top