有没有一种方法可以防止ASP.Net网站在VB端清除页面变量?

3

我有一个使用VB codebehind的ASP.Net Web应用程序。 我需要一个已声明的List变量在用户停留在页面上的时候保持不变,但目前每当控件向代码发送回复时,所有内容都会被清除。 我完全不了解ASP.net,所以我不知道这是否可能。 可以使用Session变量完成吗? 在我看来,它们似乎仅限于基本类型,但我可能是错的。

4个回答

3

了解一下ASP.NET ViewState。如果您使用它,还需要知道很多注意事项,包括页面大小膨胀和性能问题。C#代码(抱歉,我不擅长VB)如下:

List<int> MyList
{
    get { return (List<int>) ViewState["mylist"]; }
    set { ViewState["mylist"] = value; }
}

注意:不要忘记初始化这个变量。

关于使用会话状态的注意事项:如果用户同时打开了2个或更多窗口,这将无法工作。


呵呵,忘了ViewState...这说明我对它的喜爱有多少 :). 但可能是更好的选择。 - ckramer
我猜我听起来很新,但我在这方面还好。为什么视图状态会是更好的选择,即使它会减慢页面速度? - Caleb Hearth
@Chapso - 这不是一个可怕的选择。例如,如果您正在存储少量整数的列表,则可能没问题。但如果您要存储数千个整数,则可能需要寻找其他解决方案。 - Keltex

2
使用ASP.Net每次页面加载时都会创建Code Behind类的新实例,这就是为什么您的类级别变量会被重置的原因。
您最好的选择可能是将您想要保留的List存储在Session中。如果这样做可以使事情更简单,您可以创建一个getter来从session变量中读取数据。在C#中,它看起来像这样:
private List MyList
{
    get { return Session["ListKey"] as List; }
    set { Session["ListKey"] = value; }
}

我只需每次声明一个列表并将其保存到会话中,例如:Session("ListOfStuff") = codeBehindList 吗? - Caleb Hearth
@Francisco:谢谢,但我应该可以自己把C#翻译成VB :) - Caleb Hearth
仅供澄清,Session 是针对用户而不是页面本身的,对吗?因此,如果两个人同时使用该网站,则 Session 变量不会在他们之间传递数据,对吗? - Caleb Hearth
没错,Session和ViewState是针对用户特定的。 - Francisco Soto
@Chapso 如果调用Session["ListKey"]返回NULL,您只需要创建一个新列表。如果每次重新分配它,您将使用空列表覆盖先前存储的值。另一种选择可能是将属性设置为只读,并在getter中检查会话中的值是否为空。 - ckramer
没问题。我已经解决了。我在页面加载时将列表设置为一个新的,这很有效。 - Caleb Hearth

1

如果您想保存一个仅在特定页面中需要的变量,而不是在任何其他页面中需要,假设您有一个多页 Web 应用程序,您可以使用页面 ViewState 来保存您希望从请求到请求持久化的变量。

如果您需要使您的变量在不同页面之间持久化,您可以使用 Session 来保存它。

现在,当您使用 ViewState 时,您必须考虑到如果您在其中存储大型对象或者在您的页面中有许多控件,则会在 postbacks 之间来回传递一个巨大的字符串(编码视图状态),从而增加了加载时间和执行时间。


0
这是我最终使用的代码。
Private Property ChangedControls() As List(Of Control)
    Get
        Return DirectCast(Session("changedControls"), List(Of Control))
    End Get
    Set(ByVal value As List(Of Control))
        Session("changedControls") = value
    End Set
End Property

在页面加载时分配一个新的列表是完全没有问题的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接