C# 关于动态控件的复杂视图状态问题
我有一个动态加载的控件,其中包含一个中继器和其他项,例如一组文本框 该控件用于地址验证 这个过程是:C# 关于动态控件的复杂视图状态问题,c#,asp.net,dynamic,user-controls,C#,Asp.net,Dynamic,User Controls,我有一个动态加载的控件,其中包含一个中继器和其他项,例如一组文本框 该控件用于地址验证 这个过程是: 控制显示 用户输入地址信息 页面发回,控件根据web服务验证地址信息 如果地址不是100%,它将显示可能匹配的列表 大多数控件都呈现为HTML表单元素,如两个重要事实: 中继器项目中的控件应在OnItemCreated中创建,而不是OnItemDataBound中创建 ONIMCREATED在回发过程中运行,无需调用DataBind() 我一直在将用户控件加载到中继器项中,用户控件的类型基于绑定
两个重要事实:
中继器项目中的控件应在OnItemCreated中创建,而不是OnItemDataBound中创建
ONIMCREATED在回发过程中运行,无需调用DataBind()
我一直在将用户控件加载到中继器项中,用户控件的类型基于绑定到中继器的数据项。因此,我将用户控件的类型添加到repeater项的viewstate中,以便在postback上运行的OnItemCreated期间(没有要绑定的数据项,因为尚未调用DataBind()),它知道要加载的用户控件的类型。然后将应用viewstate
protected void rpTransactions_OnItemCreated(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var dataItem = e.Item.DataItem;
string typeName;
string viewStateKey = string.Concat("typeName", e.Item.ItemIndex);
if (dataItem == null)
{
typeName = ViewState[viewStateKey].ToString();
}
else
{
typeName = dataItem.GetType().ToString();
ViewState[viewStateKey] = typeName;
}
Control template = TransactionTemplateFactory(typeName);
template.ID = "trans";
e.Item.FindControl("phTransSpecific").Controls.Add(template);
}
}
如果OnItemDataBound中的代码运行,它会将此用户控件筛选出来并将其数据绑定到该控件。您当然应该能够获取用户选择的值;它将位于Request.Forms集合中,因为它是一个复选框。如果您可以获取该值并继续,是否需要重建整个控件?@dash:这是可行的。我如何知道该复选框的名称?它在一个动态加载的用户控件的中继器中。@dash:我最终使用了你的想法。我遍历request.forms,查找以复选框名称结尾的字段。一旦我发现我能够测试它并获得一些周围的数据。效果很好。把你的评论移到一个答案,我会接受的。谢谢,在这种情况下,如果提交时复选框不存在也没关系。我只是想找到第一个被检查的实例。工作得很好。谢谢