2

次のような状況があります。

ユーザーはページで特定のフィルターを定義し、ポストバック時にそのフィルターを使用してデータベースにクエリを実行し、一致する一連のレコードをユーザーに返します。それぞれの隣にチェックボックスがあるため、ユーザーはそれぞれに対処するかどうかを選択できます。それらの記録の。

従来の ASP/PHP では、「chk__*」という名前のコントロールを多数生成し、ポストバック時にすべての $ POST エントリを調べて、「chk」というプレフィックスが付いたものを探します

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 を反復処理することもできますが、よりクリーンなものを探していました

4

5 に答える 5

5

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

于 2008-10-25T00:03:14.963 に答える
4

従来の ASP で行ったのと同じ方法で行います。<asp:checkbox> の代わりに <input type="checkbox"> を使用します。Request.Form を使用して生の投稿パラメータにアクセスできます

于 2008-10-24T23:58:57.810 に答える
2

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

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

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

こんな感じかもしれません。PageMethods(そしてもちろんScriptManager)を使用したASP.NETAJAXを想定しています。

<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
         }
     }
}
于 2008-10-25T03:36:30.070 に答える
2

不条理な Viewstate 条件に直面した場合は、従来の ASP ソリューションをお勧めします。提供される優れた機能を失うのは悲しいことですが、いくつかのViewstate 対応コントロール (asp:*) といくつかの従来の手法 (input type="...") を組み合わせることで、これまでの多くの頭痛の種から解放されました。

単純なことをしたい場合があり、単純なソリューションは「WYSIWYG」フォーム編集よりも優れています。

于 2008-10-24T23:58:19.637 に答える
0

ViewState を無効にします。それができない場合は、セッションを使用してビューステートを保存してみてください

于 2008-10-24T23:50:29.793 に答える