C# NET动态控件添加

C# NET动态控件添加,c#,asp.net,dynamic,repeater,C#,Asp.net,Dynamic,Repeater,原创帖子 这里有一大堆的文章,问题比这里贴的答案多得多,所以我要问的是我的问题 我有一个我正在创建的网页,它将有一个DropDownList控件,用户可以从中选择产品以进入订单进行处理。除此之外,还有两(2)个其他DropDownList控件,包含每个特定产品的选项和附件。我希望用户能够在订单对象中输入多个产品线,以便与相应的选项和/或*附件一起进行处理。这将减少数据库中存储客户信息的记录量 当用户从这个下拉列表中选择时,我想创建一个产品列表,但是这个列表必须根据用户为特定订单输入的产品数量动态

原创帖子

这里有一大堆的文章,问题比这里贴的答案多得多,所以我要问的是我的问题

我有一个我正在创建的网页,它将有一个DropDownList控件,用户可以从中选择产品以进入订单进行处理。除此之外,还有两(2)个其他DropDownList控件,包含每个特定产品的选项和附件。我希望用户能够在订单对象中输入多个产品线,以便与相应的选项和/或*附件一起进行处理。这将减少数据库中存储客户信息的记录量

当用户从这个下拉列表中选择时,我想创建一个产品列表,但是这个列表必须根据用户为特定订单输入的产品数量动态创建。我理解保存数据所涉及的需求,因为它不会自动保存到ViewState,但却无法确定如何将数据推送到正确的方向

由于处理ViewState的复杂性,我是否应该使用ASP.NET以外的其他工具来创建网页?虽然这可能很复杂,但在尝试这样的行动时,有没有更好的方法

编辑

因此,我的发现让我相信,为了在添加数据时正确存储数据,我应该使用Repeater控件并将其数据绑定到包含KeyValuePairs中数据的Dictionary对象。我正在寻找一种简化的方法,直接添加一个包含我需要的所有数据的对象。我当然可以将这个类添加到中继器中,并将数据绑定到中继器中,但是将数据从中继器中重新水合会给我带来很多问题

public class Order
{
    public Order() { }
    public string CustomerNamer { get; set; }
    public ProductList ProductOrdered { get; set; }
}
public class ProductList : List<Product>
{
     public ProductList() { }
}
public class Product
{
     public Product() { }
     public int ID { get; set; }
     public string Name { get; set; }
     public string ProdcutCode { get; set; }
}
公共类秩序
{
公共秩序(){}
公共字符串自定义项{get;set;}
公共产品列表ProductOrdered{get;set;}
}
公共类产品列表:列表
{
公共产品列表(){}
}
公共类产品
{
公共产品(){}
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串ProdcutCode{get;set;}
}
代码隐藏:

protected void order_add_Click(object sender, EventArgs e)
{
        Dictionary<int, Order> objOrders = new Dictionary<int, Order>();

        Order objOrder = new Order();
        Product objProduct = new Product();

        objProduct.Name = "Tire";
        objProduct.ProductCode = "75R15";

        objOrder.ProductsOrdered = new ProductList();

        objOrder.ProductsOrdered.Add(objProduct);

        objOrders.Add(0, objOrder);

        rptTest.DataSource = objOrders;
        rptTest.DataBind();
}
protected void order\u add\u Click(对象发送方,事件参数e)
{
字典objOrders=新字典();
订单objOrder=新订单();
Product OBJPProduct=新产品();
objpproduct.Name=“轮胎”;
objpproduct.ProductCode=“75R15”;
objOrder.ProductsOrdered=新产品列表();
objOrder.ProductsOrdered.Add(objProduct);
对象。添加(0,对象);
rptTest.DataSource=objOrders;
rptTest.DataBind();
}

对于通过呈现页面中的
中继器表示的动态集合,我已多次成功使用此模式:

创建一个可以表示信息的内存结构

将此结构作为页面上的属性公开,并根据需要将其内部存储在
会话
视图状态

公共列表订单
{
获取{return ViewState(“OrdersList”);}
设置{ViewState(“OrdersList”)=value;}
}

DataBind()
到中继器,并让绑定将内存中的对象转换为渲染时的样子

回发时,从中继器读取任何更改并更新内存中的数据结构(在
Page\u Load
handler->
if(!IsPostback){…}


当需要将所选内容持久保存到DB(或提交订单等)时,只需从内存存储中读取信息。

对于通过呈现页面中的
转发器表示的动态集合,我已多次成功使用此模式:

创建一个可以表示信息的内存结构

将此结构作为页面上的属性公开,并根据需要将其内部存储在
会话
视图状态

公共列表订单
{
获取{return ViewState(“OrdersList”);}
设置{ViewState(“OrdersList”)=value;}
}

DataBind()
到中继器,并让绑定将内存中的对象转换为渲染时的样子

回发时,从中继器读取任何更改并更新内存中的数据结构(在
Page\u Load
handler->
if(!IsPostback){…}


当需要将所选内容持久保存到DB(或提交订单等)时,只需从内存存储中读取信息。

我看不出使用.NET有任何问题,也看不到ViewState有任何复杂性。您试图推动数据的“正确方向”是什么?数据库,会话…?目前我需要存储在ViewState中的信息,以便在某种类型的submit或save按钮回发时,我可以使用控件并将数据读取到数据对象类中进行编译,以发布到MySql DAL。我认为使用.NET没有任何问题,也没有发现ViewState有任何复杂性。您试图推动数据的“正确方向”是什么?数据库会话…?目前,我需要存储在ViewState中的信息,以便在回发某种类型的submit或save按钮时,我可以获取控件并将数据读取到数据对象类中进行编译,以发布到MySql DAL。在ViewState中放置完整的对象列表会对性能产生一些影响,因为发送回客户端的HTML页面可能很大。@Simon Mourier:如果用户使用ASPX页面在功能上创建对象时,您没有在ViewState中存储这些对象,那么您将它们存储在哪里?“我洗耳恭听!”西蒙·穆里埃:这是真的——有一场表演