维护中继器的视图状态

本文关键字:视图状态 中继器 维护 | 更新日期: 2023-09-27 18:08:29

我有一个问题,即一个中继器的视图状态,即中继器内的控件不保持他们的视图状态。

我有以下内容:

中继器1:

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

当链接按钮被点击时,CommandArgument的值被存储在页面的一个隐藏字段中。

在回发时,我无法获得隐藏字段的值,直到预呈现事件处理程序加载。所以在我的preender事件中,我获取隐藏字段的值并将其存储在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属性只在回发时更新,所以我显然必须在每次回发时重新绑定中继器——否则怎么做呢?

任何帮助都将是非常感激的。

谢谢艾尔。

维护中继器的视图状态

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

您还应该检查IsPostback标志,仅在页面未发布时绑定中继器。

澄清如果你的第二个中继器绑定在PreRender,那么ViewState不能用于持久化控件,因为它们根本不存在,当ViewState加载- Init之后,PreLoad之前。

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

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

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

这应该能解决你的问题。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
namespace Repeater
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        private List<test> list = null;
        protected void Page_Init(object sender, EventArgs e)
        {
            if (IsPostBack == false)
            {
                list = new List<test> { new test { Title = "aaaa" }, new test { Title = "bbb" } };
                Repeater1.DataSource = list;
                Repeater1.DataBind();
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected override void LoadViewState(object savedState)
        {
            if (savedState != null)
            {
                // Load State from the array of objects that was saved at ;
                // SavedViewState.
                object[] myState = (object[])savedState;
                if (myState[0] != null)
                {
                    list = Deserialize((string)myState[0]);
                    Repeater1.DataSource = list;
                    Repeater1.DataBind();
                }
                if (myState[1] != null)
                    base.LoadViewState(myState[1]);
            }
        }
        protected override object SaveViewState()
        {
            object baseState = base.SaveViewState();
            object[] allStates = new object[2];
            allStates[1] = baseState;
            allStates[0] = Serialize();
            return allStates;
        }
        string Serialize()
        {
            var writer = new StringWriter();
            var serializer = new XmlSerializer(typeof(List<test>));
            serializer.Serialize(writer, list);
            var xml = writer.ToString();
            return xml;
        }
        List<test> Deserialize(string xml)
        {
            var serializer = new XmlSerializer(typeof(List<test>));
            var deserializedBook = (List<test>)serializer.Deserialize(new StringReader(xml));
            return deserializedBook;
        }
    }
    public class test
    {
        public string Title { get; set; }
    }
}