【问题标题】:What's the best way to send a lot of checkboxes to the client in ASP.Net?在 ASP.Net 中向客户端发送大量复选框的最佳方式是什么?
【发布时间】:2008-10-25 11:36:30
【问题描述】:

我有以下情况:

用户将在页面上定义某个过滤器,并且在回发时,我将使用该过滤器查询数据库并向用户返回一堆匹配的记录,每个记录旁边都有一个复选框,因此他可以选择是否对每条记录采取行动。

在经典 ASP/PHP 中,我可以生成许多名为“chk__*”的控件,然后在回发时遍历所有 $POST 条目,寻找前缀为“chk”的条目。

在 ASP.Net 2.0 中执行此操作的最佳方法是什么?

我可以通过使用包含复选框的模板实现一个中继器来轻松地做到这一点,将中继器绑定到一个数据集,然后在第二个回发时,我只是这样做:

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.net viewstate dynamically-generated-co


    【解决方案1】:

    您看过 CheckBoxList 控件吗?您可以将它绑定到您的数据集,提供文本成员和值成员项,它还可以让您轻松查看检查了哪些项。如果需要,还可以动态添加更多复选框项。

    【讨论】:

    • 我会检查一下,如果它不起作用,我会选择 Josh 的解决方案。谢谢大家!
    【解决方案2】:

    按照与经典 ASP 相同的方式进行操作。使用 而不是 。您可以使用 Request.Form 访问原始帖子参数

    【讨论】:

    • 这是个好主意(直接生成 以避免奇怪的命名)。我会试试这个和 CheckboxList 控件,看看哪个更好(我假设 checkboxlist 控件也将使用视图状态)谢谢!
    【解决方案3】:

    当面对荒谬的 Viewstate 条件时,我推荐经典的 ASP 解决方案。失去了它提供的好功能很遗憾,但是将 一些 启用 Viewstate 的控件 (asp:*) 与一些经典技术 (input type="...") 相结合为我节省了一个 过去很多头疼。

    有时您只想做一些简单的事情,而简单的解决方案胜过“所见即所得”的表单编辑。

    【讨论】:

      【解决方案4】:

      我所做的其中一件事是在会话中通过 AJAX 记录检查的状态,然后在回发(通过 AJAX 的全部或部分)上,在会话中查找要执行所选操作的项目。

      基本思想是在复选框中添加一个 onclick 处理程序,该处理程序知道关联项的 id。在点击处理程序中,通过 AJAX 将此 id 传回服务器并将其记录在会话中——您还需要传达复选框状态,以便您可以取消选中项目。让提交控件的处理程序使用有关从会话中选择了哪些项目的数据。

      这种方式也允许您处理分页数据,因为您可以在渲染(完整或部分)带有选中项的页面时从会话中设置复选框的初始值。

      它可能看起来像这样。假设 ASP.NET AJAX 带有 PageMethods(当然还有 ScriptManager)。

      <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
               }
           }
      }
      

      【讨论】:

      • 感谢您的建议!我最终将手动输出 的“ASP 经典样式”,因为这是最简单的路径,但这是一个为将来记住的好主意,我从来没有想过这一点。谢谢!
      【解决方案5】:

      禁用 ViewState。如果无法完成,请尝试使用Session to store the view state

      【讨论】:

      • 我可以禁用 Viewstate 的唯一方法是在 Page_Load 事件之前重新生成控件树(因此,在 Page_Init 上)。但那时我无法读取过滤器控件的数据以重新查询数据库(至少不干净)。
      • 至于将 Viewstate 存储在其他地方,老实说,这似乎比它值得做的工作更多……感谢您的想法!
      • 文本框或页面上的某些内容中不存在过滤器控件的数据,其值将通过回发保留?
      • @Ramesh:是的,它们会,但在 Page_Init 运行时,它们不会加载到控件的值中。而且我需要在 Page_Load 之前重新填充控件,否则 ASP.Net 不会加载“检查了哪些控件”
      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 2010-09-08
      • 2010-11-04
      • 2016-08-02
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多