asp.net webforms - 这是一个坚持状态的好方法吗?

时间:2009-12-08 20:29:34

标签: asp.net webforms

这是关于asp.net WebForms和sessionstate的问题。我知道这可能是MVC更好的情况,但我需要使用WebForms。

在我的页面的OnLoad事件中,我初始化了一个对象及其属性(一次调用db,然后是属性的一些逻辑。)我使用这个对象来填充页面上的控件,例如。 lblTitle.text = myObj.Title。

此页面上还有一个输入文本框,用户将在其中输入一些信息,然后按“保存”按钮。这将调用一个实用程序函数,它将文本框的内容写入文件并保存。此外,它需要将其保存到名称包含在myObj.Title中的文件中。

这是我的问题 - 由于WebForms的无状态方面,在页面加载后,myObj消失了。*这意味着我不能在保存时做这样简单的事情:Util.save(contentsoftextbox,myObj.Title)。

所以我通过将myObj.Title的值写入会话变量(页面的OnLoad事件中的Session.Add [“title”] = myObj.Title来解决它。然后当调用save函数时,我使用此会话我的第二个参数的变量。

感谢您阅读此内容。

我的问题是:

这感觉就像是完成工作的一种不必要的复杂方式。是吗?我还能做些什么来完成这项任务?

*正确?

7 个答案:

答案 0 :(得分:5)

你看过ViewState了吗?如果您只需要访问您所在页面上的对象而不是将其保留在Session中,那么可能是更好的选择吗?

答案 1 :(得分:4)

在大多数情况下,我会在回发时再次初始化myObj。

答案 2 :(得分:1)

这听起来像是一个很好的方式来做到这一点。我不知道您系统的详细信息,但也许您应该考虑在会话中保存MyObj而不仅仅是标题。

答案 3 :(得分:0)

您可以将其保存在ViewState

答案 4 :(得分:0)

在Input type = hidden中输入相同的值。这样在帖子后面你可以从它读回来。

将这些值放在会话上是一种习惯的方式,但最好避免这种路由,原因很多与维护服务器而不是浏览器上的会话状态有关,包括但不限于要求会话关联(会话cookie) ,粘性会话等。)

答案 5 :(得分:0)

小心将对象存储在会话中。如果您不使用In-proc,则存储在会话中的对象必须是可序列化的,以便可以扩展。

另一个选项(如果你想将它存储在客户端,你不在乎对象是否在浏览器中是纯文本):你可以使用custom properties on your text boxserialize your object/property to JSON使用JavaScriptSerializer

您可以阅读有关HTML 5数据属性here

的更多信息

答案 6 :(得分:0)

会话有效,但在服务器场中变得很麻烦。我尽量避免使用会话。

我特别不喜欢将会话用于特定于页面的事情,因为如果用户从未在页面上完成操作,则可能永远不会从会话中删除该值。系统中的一堆页面很快就会出现非常污染的会话,并且很容易得到一些错误,这些错误会影响会话值,而这些错误只是早期某些操作的残留。

Viewstate,可以工作并避免会话问题。

重新加载,与页面相关的对象通常是完全可以接受的,有时还需要其他原因。重新加载是我首选的“默认”,但有些对象可能太昂贵而无法重新加载。

只需将值放在隐藏字段中,就像使用viewstate一样。对于像单个标题这样的简单事物,我更喜欢隐藏字段而不是viewstate,因为我喜欢尽可能保持人类可读的内容。然而,篡改隐藏字段比使用viewstate更容易,因此如果黑客/安全是一个问题,隐藏字段不是一个好的选择。