我有一个父控件,它有一个HiddenField子控件的实例。我正在使用CreateChildControls()来添加它。一切都在客户端工作,包括添加到字段中的值。但是,在回发时,对该字段的引用为空
这是代码
protected override void CreateChildControls()
{
assignedListField = new HiddenField();
assignedListField.ID = ClientID + "_HiddenAssignedList";
assignedListField.EnableViewState = true;
Controls.Add(assignedListField);
base.CreateChildControls();
}
public IList<DlpItem> GetAssignedItems()
{
//assignedListField = FindControl(ClientID + "_HiddenUnassignedList") as HiddenField;
var TmpAssignedItems = new List<DlpItem>();
var list = assignedListField.Value;
var items = list.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var item in items)
{
var mix = item.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
var text = mix[0];
var id = int.Parse(mix[1]);
TmpAssignedItems.Add(new DlpItem(text, id));
}
return TmpAssignedItems;
}
我尝试过简单地依赖ViewState ...然后也尝试使用FindControl()。两者都不起作用,它作为一个空引用出现......关于这里发生什么的任何输入?
答案 0 :(得分:3)
正如@Sebastian所说,如果您需要使用任何控件,它们可能为null,因为它们不可用。但是,您可以调用EnsureChildControls来创建控件集合并确保它在那里。这不包括加载ViewState。
但是,如果您的客户端操作会影响数据,则不能依赖于viewstate。您需要做的是让您的控件实现IPostBackDataHandler。在LostPostData中,您需要检查隐藏变量。使用postCollection [ClientID +“_ HiddenAssignedList”],您可以获取发布到服务器的字符串值,并处理结果。
HTH。
答案 1 :(得分:0)
加载ViewState时很可能还没有调用CreateChildControls()
(可能在你的情况下,ControlState更有用)。
请参阅http://msdn.microsoft.com/en-us/library/aa719775%28vs.71%29.aspx了解执行生命周期。
您可以使用LoadViewState
(SaveViewState
) - 方法(http://msdn.microsoft.com/de-de/library/system.web.ui.control.loadviewstate.aspx)存储(并加载)状态,并将值存储在字段中,直到CreateChildControls()
被调用