如何在插入数据库之前在回发之间保留临时值?

时间:2012-10-18 16:43:57

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

一般问题:

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

enter image description here

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

问题:

在Postbacks之间保留产品选择的最佳方法是什么?

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

我目前的做法:

我现在正在这样做的方法是管理viewstate中的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会得到腐败或变得太大。你觉得怎么样?

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

既然你要求最好的方法,我会使用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应用程序

答案 1 :(得分:1)

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

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

现在,在viewstate上避免太大,你可以做以下(一起):

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

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

How to optimize class for viewstate

有关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