在PostBack中使用类

时间:2013-05-09 18:58:48

标签: asp.net vb.net

我对课程和OOP都很陌生,所以请耐心等待。

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

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

然后我需要将文本框中的值与产品的属性进行比较。我有

的textchanged事件

If textbox1.Text <> product.description Then....

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

昏暗的陈述是Dim product as New product

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

波浪线已经消失,但是当我运行页面时,页面加载时一切正常。显示数据,以便我的产品类正常工作。一旦我在textbox1中进行了更改,事件触发器product.description就没有了。它重新焕发了活力。

如何阻止这种情况发生......

3 个答案:

答案 0 :(得分:1)

您的“产品”不会在回发之间保留。

仅自动保留/恢复aspx页面中的控件对象。

为了解决这个问题,有多种方法。

如果通过设置“Product.id = 1”加载产品,那么我所做的就是有一个隐藏字段,在prerender事件期间(将其保存在页面中)和init事件中接收product.id的值我会恢复“Product.id = hiddenfield.value”,但只有在重新加载对象的回发时才会恢复。

修改

感谢您选择我的答案。我会详细说明处理这个的各种方法,以及为什么我建议我的答案。

将密钥存储在数据库中的HiddenField Reload中

PROS:产品始终为Fresh / Correct / Current值。对应数据库。数据库非常有效地返回基于主键的记录。从客户端浏览器发送和回发的数据非常少。复杂性低。客户打开的每个页面都是安全隔离的。

CONS:多个数据库事务。如果数据库已经过度紧张或非常庞大,您可能需要考虑最小的效率增益,但这不常见或可能基于主键的记录

会话状态(存储整个对象)

PROS:“加载”对象的最短时间,因为它已经在内存中加载后可用。减少数据库事务。没有数据捎带回客户端,然后再返回。

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

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

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

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

同样,还有很多其他方法可以解决这个问题,比如将同步的字典样式对象中的项目存储到应用程序中,但是随着时间的推移会越来越复杂。

答案 1 :(得分:1)

这可能是标准的ASP.NET page life cycle问题。

初始化页面后,它会被发送到用户的浏览器。当用户点击某些内容时,浏览器会将回发请求发送回您的应用程序。视图状态允许textbox1对象记住其Text属性中的内容。但是,您的Page_Load从头开始运行,是的,包括您的产品对象在内的所有内容都是从头开始重新创建的。

如果您希望产品对象在回发之前“记住”它所知道的内容,则必须提醒它。一种方法是将初始值存储在Session state中,然后在Page_Load方法的回发部分刷新产品对象。

答案 2 :(得分:1)

每次进行回发时,您都在使用网页类的新实例。您的课程的先前副本被丢弃,可能在您的浏览器甚至将页面呈现到屏幕之前处理。

如果你想在http请求中保留一个值(其中回发只是一种类型),那么你需要把它放在像Session这样的地方。