Asp.net 在回发中使用类

Asp.net 在回发中使用类,asp.net,vb.net,Asp.net,Vb.net,我对课程和面向对象编程完全陌生,所以请容忍我 我正在创建一个大型web应用程序,通过创建自己的类来保持整洁 例如,我有一个公共类产品,它有几个属性。我使用它的一种方法是在页面加载时,将产品ID分配给ID属性,该属性反过来获取该产品的详细信息,并将各种数据分配给其他属性。因此,在我的代码中,我可以使用例如product.price或product.description,并获得适当的值。这工作得很好,但我发现,因为类是在页面加载时启动的,所以每次页面刷新时,它都会从数据库中获取数据。我通过使用If

我对课程和面向对象编程完全陌生,所以请容忍我

我正在创建一个大型web应用程序,通过创建自己的类来保持整洁

例如,我有一个
公共类产品
,它有几个属性。我使用它的一种方法是在页面加载时,将产品ID分配给ID属性,该属性反过来获取该产品的详细信息,并将各种数据分配给其他属性。因此,在我的代码中,我可以使用例如product.price或product.description,并获得适当的值。这工作得很好,但我发现,因为类是在页面加载时启动的,所以每次页面刷新时,它都会从数据库中获取数据。我通过使用
If Not IsPostback
启动类来停止此操作。这意味着数据只在初始页面加载时被拉入。到目前为止还不错

然后,我需要将文本框中的值与产品的属性进行比较。我有一个与的textchanged事件

如果textbox1.Text product.description,则….

但是这里我在
product.description
下得到一条波浪线,VS2010表示对象没有定义。它在page.load中变暗了,所以我将Dim语句移到了page类之外,这样页面上的所有事件都可以访问它

dim语句是
dim产品作为新产品

在我的非ispostback代码块中,我有一个示例
product.ID=1
,它将获得产品1的所有产品属性

波浪线已经消失了,但当我运行页面时,页面加载时一切都正常。显示数据,因此我的产品类工作正常。只要我在textbox1中做了更改,事件就会触发
product.description
什么都不是。它得到了重新注资

我怎样才能阻止这一切的发生

您的“产品”不会在回发之间持久化

只有aspx页中的控件对象才会自动持久化/恢复

要解决这一问题,有多种方法

如果产品是通过设置“Product.id=1”加载的,那么我要做的是在prerender事件期间(将其保存在页面中)有一个接收Product.id值的hiddenfield,并且在初始化事件中,我将恢复“Product.id=hiddenfield.value”,但仅当它是回发以重新加载对象时

编辑

谢谢你选择我的答案。我将详细阐述处理这个问题的各种方法,以及我为什么提出我的答案

将密钥存储在HiddenField中从数据库重新加载

优点:产品总是新鲜/正确/当前值。对应于数据库。数据库返回基于主键的记录非常有效。很少有数据被发送到客户端浏览器或从客户端浏览器发回。低复杂性。客户端打开的每个页面都是安全隔离的

缺点:多个数据库事务。如果数据库已经紧张或非常庞大,您可能需要考虑即使是最小的效率增益,但是这对于主键记录

来说并不常见或可能。 会话状态(存储整个对象)

优点:加载对象的时间最短,因为一旦加载对象,它就可以在内存中使用。更少的数据库事务。没有数据通过背驮回到客户机并再次返回

缺点:如果在数据库中更改,对象可能会“过时”。如果打开应用程序多个页面的用户都需要不同的“产品”,那么最终可能会得到错误的对象,因此为了完全安全,您需要一个更复杂的结构来存储多个产品或基于某种密钥(如产品ID)存储它们。使用服务器内存时,如果服务于数千个用户或您的产品数据很大,这可能会成为一个问题,特别是如果您在包含许多对象的多个页面中执行此操作

序列化(将页面中的整个对象存储在一个字段中,类似于事件状态)

优点:一旦加载,特定产品的数据库只被访问一次,然后产品被保存在页面内,由服务器根据字段中的数据或通过viewstate重新创建。客户端打开的每个页面都是安全隔离的。很容易实现在页面的ViewState中存储

缺点:如果在数据库中更改,对象可能会“过时”。分配更多数据将被添加到您的页面响应和用户的下一页请求中。实现起来更复杂,因为需要将对象设计为正确序列化。复杂对象需要分配手动代码才能成功序列化

同样,还有许多其他方法可以解决这个问题,例如将项目存储在应用程序全局的synclocked dictionary样式的对象中,但随着时间的推移,它会变得越来越复杂。

您的“产品”不会在回发之间持久化

只有aspx页中的控件对象才会自动持久化/恢复

要解决这一问题,有多种方法

如果产品是通过设置“Product.id=1”加载的,那么我要做的是在prerender事件期间(将其保存在页面中)有一个接收Product.id值的hiddenfield,并且在初始化事件中,我将恢复“Product.id=hiddenfield.value”,但仅当它是回发以重新加载对象时

编辑

谢谢你选择我的答案。我将详细阐述处理这个问题的各种方法,以及我为什么提出我的答案

将密钥存储在HiddenField中从数据库重新加载

优点:产品总是新鲜/正确/当前值。对应于数据库。数据库返回基于主键的记录非常有效。很少有数据被发送到客户端浏览器或从客户端浏览器发回。低复杂性。客户端打开的每个页面都是安全隔离的

缺点:多个数据库事务。如果数据库已经紧张或非常庞大,你甚至可能需要考虑SMA。