C# 关于动态控件的复杂视图状态问题

C# 关于动态控件的复杂视图状态问题,c#,asp.net,dynamic,user-controls,C#,Asp.net,Dynamic,User Controls,我有一个动态加载的控件,其中包含一个中继器和其他项,例如一组文本框 该控件用于地址验证 这个过程是: 控制显示 用户输入地址信息 页面发回,控件根据web服务验证地址信息 如果地址不是100%,它将显示可能匹配的列表 大多数控件都呈现为HTML表单元素,如两个重要事实: 中继器项目中的控件应在OnItemCreated中创建,而不是OnItemDataBound中创建 ONIMCREATED在回发过程中运行,无需调用DataBind() 我一直在将用户控件加载到中继器项中,用户控件的类型基于绑定

我有一个动态加载的控件,其中包含一个中继器和其他项,例如一组文本框

该控件用于地址验证

这个过程是:

  • 控制显示
  • 用户输入地址信息
  • 页面发回,控件根据web服务验证地址信息

  • 如果地址不是100%,它将显示可能匹配的列表 大多数控件都呈现为HTML表单元素,如
    两个重要事实:

  • 中继器项目中的控件应在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,查找以复选框名称结尾的字段。一旦我发现我能够测试它并获得一些周围的数据。效果很好。把你的评论移到一个答案,我会接受的。谢谢,在这种情况下,如果提交时复选框不存在也没关系。我只是想找到第一个被检查的实例。工作得很好。谢谢