【问题标题】:How to persist temporary values between postbacks before inserting to the database?如何在插入数据库之前在回发之间保留临时值?
【发布时间】:2012-10-18 16:43:57
【问题描述】:

一般问题:

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

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

问题:

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

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

我目前的做法:

我现在的做法是管理视图状态中的 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 得到损坏或变得太大。你怎么看?

感谢您的宝贵时间!

【问题讨论】:

    标签: asp.net vb.net session persistence viewstate


    【解决方案1】:

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

    现在,如果您想坚持传统的 WebForms 方法,为什么不优雅?创建一个简单的 UserControl 来为您处理所有这些(您也可以将UpdatePanel 与动态控件结合使用)。您只需要动态添加这些控件(如果您知道Page's lifecycle,这很容易),I have some working examples on my GitHub site

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

    这样您就可以与 ASP.NET 协调工作

    编辑 1

    此外,基于此:

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

    也许控件是你的最佳选择

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

    【讨论】:

    • 有趣。我对可以使用的技术有一些限制,但我会看看。谢谢
    • 我想我明白你的意思了。因此,如果我将每个选择都作为我的 UserControl 的一个实例,那么我可以将它们动态添加到面板中,这样我就不必担心在这种情况下将数据存储在视图状态中,对吧?
    • 是的,只要您在正确的事件中创建控件(Init - 您实际上可以在Load 事件中创建它们)。请记住,必须在每个帖子上重新创建动态控件,但这是一项简单的任务,您可以查看示例on my Github site
    • 非常感谢您的示例。看起来我无法在我的情况下使用视图状态来逃避,因为我需要在重新创建动态控件时添加的每个 ProductListItem。
    【解决方案2】:

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

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

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

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

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

    How to optimize class for viewstate

    更多关于视图状态优化:

    Determine size of ASP.NET page's viewstate before serving page
    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

    【讨论】:

      猜你喜欢
      • 2014-01-16
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      相关资源
      最近更新 更多