我正在尝试创建与此类似的东西:
用户可以从下拉列表中选择产品,单击“添加”,结果是另一个产品 在“已添加产品”部分中添加了一行。必须为通过每行下拉列表添加的每个产品选择“产品描述符”。只有当用户单击“提交”按钮时,每个产品行才会插入到数据库中。
在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会得到腐败或变得太大。你觉得怎么样?
谢谢你的时间!
答案 0 :(得分:2)
既然你要求最好的方法,我会使用jQuery + knockoutJS。
现在如果你想坚持使用传统的WebForms方法,为什么不够优雅?创建一个简单的UserControl来为您处理所有这些(您还可以将UpdatePanel
与动态控件结合使用)。您只需要动态添加这些控件(如果您了解Page's lifecycle,这很容易),I have some working examples on my GitHub site
在您的控件中,您将公开类型为ProductListItem
的属性,并在您的页面中迭代所有选定的产品(UserControls)并简单地询问ProductListItem
属性
这样你就可以与ASP.NET协调工作了
此外,基于此:
我想在这里使用Session而不是Viewstate,因为我在同一页面上有两个类似的情况
也许控件是你的最佳选择
我不建议你使用Session作为个人选择,我倾向于尽可能避免使用Session
来释放服务器资源,而是使用用户PC的强大功能尽可能多地使用客户端脚本,这样在需要时可以轻松扩展Web应用程序
答案 1 :(得分:1)
视图状态是解决方案,因为如果将它们保存在会话中,则会出现以下主要问题:
现在,在viewstate上避免太大,你可以做以下(一起):
您还可以创建一个类,将所有数据保存在一起,对其进行优化并将其保存在viewstate上。在每个页面加载时,使用此类重新创建页面表单。
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