2

我有以下情况:

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

在 Classic 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 进行迭代,但是,我正在寻找一个更清洁的

4

5 回答 5

5

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

于 2008-10-25T00:03:14.963 回答
4

以与经典 ASP 中相同的方式执行此操作。使用 <input type="checkbox"> 而不是 <asp:checkbox>。您可以使用 Request.Form 访问原始帖子参数

于 2008-10-24T23:58:57.810 回答
2

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

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

于 2008-10-24T23:58:19.637 回答
2

我所做的一件事是在会话中通过 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
         }
     }
}
于 2008-10-25T03:36:30.070 回答
0

禁用 ViewState。如果无法完成,请尝试使用Session 来存储视图状态

于 2008-10-24T23:50:29.793 回答