【问题标题】:.net CheckBoxList losing selected property after postback.net CheckBoxList 在回发后丢失选定的属性
【发布时间】:2016-06-23 20:25:19
【问题描述】:

我有一个嵌套在Repeater 中的CheckBoxList,它动态填充在Repeater 的OnItemDataBound 中。单击按钮时,我想保存对每个复选框列表的更改,但回发后选定的属性始终为 TRUE。

HTML:

<asp:Repeater id="rptFields" runat="server" OnItemDataBound="rptField_OnItemDataBound">
  <ItemTemplate>
    <asp:HiddenField id="hFieldID" runat="server" Value='<%#DataBinder.Eval(Container.DataItem,"ID")%>' />
    <asp:Label id="lblDesc" runat="server" Text='<%#DataBinder.Eval(Container.DataItem,"Description")%>' />
    <asp:CheckBoxList id="chkOptions" runat="server" ></asp:CheckBoxList>
  </ItemTemplate>
</asp:Repeater>
<asp:Button id="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" />

代码背后:

protected void Page_Load(object sender, EventArgs e)
{
  if(!Page.IsPostBack)
  {
    rptFields.DataSource = Fields;
    rptFields.DataBind();
  }
}

protected void rptField_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.Item)
            || (e.Item.ItemType == ListItemType.AlternatingItem)
  {
    CheckBoxList chkOptions = (CheckBoxList)e.Items.FindControl("chkOptions");
    Field ThisField = (Field)e.Item.DataItem;

    for (int i = 0; i < ThisField.Options.Length; i++)
    {                   
        ListItem liOption = new ListItem (ThisField.Options [i].Description, ThisField.Options [i].ID.ToString ());

        liOption.Selected = ThisField.Options [i].Selected;

        chkOptions.Items.Add (liOption);
    }
  }
}

protected void btnSave_Click(object sender, EventArgs e)
{
  foreach (RepeaterItem rptItem in rptFields)
  {
    int iFieldID = int.parse(rptItem.FindControl("hFieldID"));
    Field ThisField = GetFieldByID(iFieldID);
    CheckBoxList chkOptions = (CheckBoxList)rptItem.FindControl("chkOptions");

    foreach(Option ThisOption in ThisField.Options)
    {
      for(int i = 0;i < chkOptions.Items.Count; i++)
      {
        int OptionID = int.parse(chkOptions.Items[i].Value);
        if(ThisOption.ID == OptionID)
        {
          //HERE IS THE PROBLEM
          //SELECTED IS ALWAYS TRUE
          ThisOption.Selected = chkOptions.Items[i].Selected;
          ThisOption.Save();
        }
      }
    }
  }
}

来自转发器的所有数据都将保留,包括复选框列表项的文本和值字段。除选定属性外的所有属性。

我已经搜索并搜索了一个答案,但不存在。每个类似的问题都是人们在每次回发中重新绑定列表。如您所见,情况并非如此。对于它的价值,完全相同的解决方案适用于单选按钮列表没有问题。

编辑:记录一下,这个项目正在运行 Mono.net 4.5

更新:同样的解决方案适用于我们使用 .Net 2.0 构建的另一个项目。我不确定这是 Mono 问题还是存在更改回发行为的配置设置。

【问题讨论】:

  • 我认为您将拥有If(IsPostBack){ } else{ },如果您在 Page_Load 事件和 btnSave_Click 事件中设置断点,您实际上可以检查当前的行为。还 ListItem liOption 在类级别将其创建为静态或受保护的。或者学习使用 Session 变量。并将值返回为 ListItem
  • If(IsPostBack) 上的一个 else{ } 对我没有任何好处,因为我在 Page_Load 中没有其他需要做的事情。至于 btnSave_Click 我使用断点来确认 Selected 属性的状态。我知道如何使用会话变量,但我不确定如何在不执行回发的情况下将状态存储到会话中每个列表中的每个复选框。所有其他值都在 ViewState 中结转,为什么不是 selected 属性?

标签: c# asp.net checkboxlist


【解决方案1】:

我最近有一个类似的问题,要解决它,你可以将它存储在查询字符串中。

【讨论】:

  • 这不是一个很好的答案。在这种情况下,将其存储在会话变量中会更好。
  • 将它存储在会话(或 QueryString)中对我有什么好处?我在回发时丢失了该属性,并且在用户单击保存之前不知道选中了哪些复选框......
  • 因为您需要了解页面生命周期以及回发是什么以及触发回发的原因。您也可以通过 javascript 完成此操作,还可以查看如何使用 __DoPostBack 函数您正在尝试什么做起来并不难@BrycePat
  • 好吧@MethodMan 我确实了解什么是回发以及触发它们的原因。我看不出如何使用 __DoPostBack 触发一个使用 javascript 来解决问题。问题是所选属性没有被保留。您实际上还没有提供解决方案。请问可以吗?
  • Methodman 是正确的,我的解决方案是发布到 Web 服务,我不能使用会话变量,但在这种情况下你可以而且应该。
猜你喜欢
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多