【问题标题】:ASP.NET Dynamic Control AdditionASP.NET 动态控件添加
【发布时间】:2011-02-03 21:10:15
【问题描述】:

原帖

那里有 的文章,比我在 SO 上针对我的特定问题发布的答案要多得多。

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

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

由于处理 ViewState 的复杂性,我是否应该寻找使用 ASP.NET 以外的东西来创建我的网页?虽然它可能很复杂,但在尝试这样的行动过程时是否有更好的方法可以使用?

编辑

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

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; }
}

代码隐藏:

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();
}

【问题讨论】:

  • 我没有看到使用 .NET 有任何问题,也没有看到 ViewState 有任何复杂性。您尝试推送数据的“正确方向”是什么?数据库、会话...?
  • 目前我需要存储在 ViewState 中的信息,以便在某种类型的提交或保存按钮的 PostBack 上,我可以控制并读出数据以编译到数据对象类中以进行发布到 MySql DAL。

标签: c# asp.net dynamic repeater


【解决方案1】:

对于在渲染页面中通过Repeater 表示的动态集合,我已经多次成功使用此模式:

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

将此结构公开为页面上的属性,并在内部酌情将其存储在SessionViewState 中。

public List<Order> Orders { get { return ViewState("OrdersList"); } set { ViewState("OrdersList") = value; } }

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

在回发时,从转发器读取任何更改并更新您的内存数据结构(在 Page_Load 处理程序中 -> if (!IsPostback) {...})。

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

【讨论】:

  • 将完整的对象列表放入 ViewState 可能会对性能产生一些影响,因为发送回客户端的 HTML 页面的大小可能很大。
  • @Simon Mourier:如果您没有将对象存储在 ViewState 中,因为用户在功能上使用 ASPX 页面创建它们,那么您将它们存储在哪里?我全神贯注。
  • @Simon Mourier:这是真的——随着 ViewState 的增长,性能会受到影响。替代方法是使用保留在服务器上的 Session 或覆盖 Page 通过覆盖 SavePageStateToPersistenceMedium()LoadPageStateFromPersistenceMedium 事件处理程序将 ViewState 持久保存在其他地方(如在 Session 中)。 (msdn.microsoft.com/en-us/library/…)
  • @Jeff - 通常,您不必在两个不同的地方存储相同的数据。如果您管理订单,它们可能存储在后端数据库中,并且您不需要将它放在客户端 HTML 页面上(因为它们需要在每次用户请求时来回序列化,并且数据库对此更好)。这可以完成,它在技术上可以工作,但你必须小心。 ViewState 更多地存在于当前不存在于其他地方的临时信息(例如尚未保存但您需要在每个用户请求时保留的表单内容)。
  • @Simon Mourier:你的最后一句话正好指向我的问题。我在表单中创建了一个 Orders 对象,它会根据用户选择添加到表单的产品数量动态增长。因此,新控件会根据用户动态添加到表单中。我不知道每次在添加控件时提交回发时将 Order 对象保存到数据库并将其发回将是处理它的正确方法。所以 ViewState 我来了!
猜你喜欢
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2010-11-04
  • 1970-01-01
相关资源
最近更新 更多