【问题标题】:Maintaining viewstate of a repeater维护转发器的视图状态
【发布时间】:2011-09-14 12:36:05
【问题描述】:

我有一个问题,即转发器的视图状态,即转发器中的控件没有保持它们的视图状态。

我有以下几点:

中继器 1:

<asp:Repeater ID="rptImages" runat="server">
<ItemTemplate>
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" />
</ItemTemplate>
</asp:Repeater>

单击链接按钮时,CommandArgument 的值存储在页面上的隐藏字段中。

回发后,在加载预渲染事件处理程序之前,我无法获取隐藏字段的值。因此,在我的预渲染事件中,我获取隐藏字段的值并将其存储在 List 属性中,如下所示:

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) {
        this.ImageList.Add(this.SelectedImageIDsInput.Text);
    }

List 属性看起来像这样:

public List<string> ImageList {
    get {
        if (this.ViewState["ImageList"] == null) {
            this.ViewState["ImageList"] = new List<string>();
        }
        return (List<string>)(this.ViewState["ImageList"]);
    }
    set { this.ViewState["ImageString"] = value; }
}

一旦我将值存储到我的 List 属性中,我就会绑定我的第二个转发器(再次在 prerender 事件中):

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList;
this.rptSelectedImages.DataBind();

第二个中继器有一个下拉列表和一个文本框。问题是这些子控件的视图状态没有得到维护。我认为这是因为每次回发我都会重新绑定转发器,因此它会被重建。我不知道我怎么可能绕过这个? ImageList 属性仅在回发时更新,因此我显然必须在每次回发时重新绑定转发器 - 还能怎么做?

任何帮助将不胜感激。

谢谢 铝

【问题讨论】:

标签: c# asp.net repeater viewstate asprepeater


【解决方案1】:

如果您要重新绑定中继器,则需要在加载 ViewState 之前在 Init 上执行此操作。

您还应该检查IsPostback 标志,并且仅在页面未回发时绑定转发器。

澄清您的第二个中继器是否绑定在PreRender 上,然后ViewState 不能用于持久化控件,因为在加载ViewState 时它们根本不存在 - 在Init 之后和@987654328 之前@。

您需要在每次回发时继续绑定,或者在Session 中存储或列出,以便您可以访问该列表以在Init(或更改时)绑定一次。

【讨论】:

  • 嗨 CodeKing。虽然有两个问题 - 我无法早在 Init 事件时获得隐藏字段的值 - 加上 ImageList 属性只能在回发时更新.....
  • 在这种情况下,您需要在每次呼叫时使用隐藏字段中的值重新绑定第二个中继器。
  • 嗨 CodeKing - 这正是我正在做的事情,不是吗?我是不是误解了你的回复。我目前等到 onprerender 获取隐藏字段的值,然后重新绑定转发器 - 问题是转发器中控件的视图状态不会在回发中持续存在....
  • 为了使控件与 ViewState 保持一致,它们必须在 PreLoad 之前存在。这是因为 ViewState 在 Init 之后和 PreLoad 之前加载。如果您在 PreRender 上绑定转发器,则不能使用 ViewState。
  • 嗨 CodeKing - 您的反馈没有让页面完全正常工作,但它已经解决了视图状态问题。谢谢
【解决方案2】:

我看不出将CommandArgument 属性复制到隐藏字段的意义。您应该做的是在Repeater 上使用ItemCommand 事件并使用事件冒泡。您可以像这样处理LinkButton 上的Click 事件:

repeater.ItemCommand += (sender, eventArgs) => {  
   var commandArgument = eventArgs.CommandArguments;
   ImageList.Add(commandArgument);
   rptSelectedImages.DataSource = ImageList;
   rptSelectedImages.DataBind();
}

【讨论】:

  • 嗨 Mikael - 我知道将它复制到隐藏字段似乎很疯狂。问题是我在同一页面上也有一个 jQuery 图像上传——一旦文件上传,处理程序返回新的 ImageId——当然 JS 不能调用 ImageList.Add 所以它必须存储在隐藏字段中。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多