维护中继器的视图状态
本文关键字:视图状态 中继器 维护 | 更新日期: 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; }
}
}