5

一般问题:

我正在尝试创建类似的东西:

在此处输入图像描述

用户可以从下拉列表中选择一个产品,单击添加,结果是在“已添加产品”部分下方添加了另一个产品行。必须为通过每行中的下拉列表添加的每个产品选择“产品描述符”。只有当用户单击“提交”按钮时,每个产品行才会插入到数据库中。

问题:

在回发之间保持产品选择的最佳方式是什么?

我不担心坚持“产品描述符”选择,我相信我可以做到。我主要关心的是在将这些临时选择保存到数据库之前找到存储这些临时选择的最佳方法。

我目前的做法:

我现在这样做的方式是管理视图状态中的 ProductListItem 对象列表。此列表绑定到显示添加的产品的 ListView。

Private Property SelectedProductList As List(Of ProductListItem)
        Get
            Return CType(ViewState("SelectedProductList"), List(Of ProductListItem ))
        End Get
        Set(ByVal value As List(Of ProductListItem ))
            ViewState("SelectedProductList") = value
        End Set
End Property

ProductListItem 类:

<Serializable()>
Public Class ProductListItem

    Public Property ProductID As Integer
    Public Property ProductName As String

    ' ProductDescriptor class represents Product Descriptor (details omitted)
    Public Property Descriptor As ProductDescriptor 

    ' Constructor omitted

End Class

添加按钮单击处理程序:

 Protected Sub btnAddProduct_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddProduct.Click

        SelectedProductList.Add( New ProductListItem(...) )
        ProductListView.DataSource = SelectedProductList
        ProductListView.DataBind()

  End Sub

我正在考虑在这里使用 Session 而不是 Viewstate,因为我在同一页面上还有另外两种类似的情况,我在 viewstate 中保留对象列表,我担心 Viewstate 被损坏或得到太大。你怎么看?

谢谢你的时间!

4

2 回答 2

2

既然你要求最好的方法,我会使用 jQuery + knockoutJS。

现在,如果您想坚持传统的 WebForms 方法,为什么不优雅呢?创建一个简单的 UserControl 来为您处理所有这些(您也可以将 anUpdatePanel与动态控件结合使用)。您只需要动态添加这些控件(如果您知道页面的生命周期,这很容易),我的 GitHub 站点上有一些工作示例

在您的控件中,您将公开一个类型的属性,ProductListItem在您的页面中,您将遍历所有选定的产品(UserControls)并简单地询问该ProductListItem属性

这样您就可以与 ASP.NET 和谐相处

编辑 1

此外,基于此:

我正在考虑在这里使用 Session 而不是 Viewstate,因为我在同一页面上还有另外两种类似的情况

也许控件是您的最佳选择

我不建议您使用 Session,作为个人选择,我倾向于尽可能避免使用 SessionSession来释放服务器资源,而是尽可能多地使用用户 PC 的功能,使用客户端脚本,这在需要时可以轻松扩展您的 Web 应用程序

于 2012-10-18T17:09:15.307 回答
1

视图状态是解决方案,因为如果您将它们保存在会话中,您将遇到以下主要问题:

  • 在用户按下提交之前,会话可能会丢失
  • 用户可以打开多个具有相同内容的窗口,但会话将相同,并且会发生很大的混乱。

现在,在视图状态上避免太大,您可以执行以下操作(全部一起):

  • 压缩它
  • 拆分它。
  • 优化你在上面写的内容,例如你可以在那里写 100 条 DropDownList 记录,或者只是获取那 100 条记录的 sql 选择。

您还可以创建一个将所有数据保存在一起的类,对其进行优化并将其保存在视图状态中。在每次页面加载时,使用此类重新创建页面表单。

如何优化视图状态的类

更多关于视图状态优化:

在提供页面之前确定 ASP.NET 页面视图状态的大小
http://www.codeproject.com/Articles/14733/ViewState-Compression
http://www.hanselman.com/blog/ZippingCompressingViewStateInASPNET.aspx
http://www.bloggingdeveloper .com/post/How-To-Compress-ViewState-in-ASPNET-20-ViewState-Compression-with-SystemIOCompression.aspx

于 2012-10-18T17:00:17.957 回答