【问题标题】:How to declare common variable for all action in a asp.net page如何为 asp.net 页面中的所有操作声明公共变量
【发布时间】:2014-12-01 14:32:29
【问题描述】:

我有一个带有next和back按钮的asp.net页面和一个变量“i”,每次单击next或back按钮,变量“i”都会增加或减少1。那么我如何声明变量i? 我不想使用“public static int i” 我应该使用会话还是视图状态? 有没有更好的方法来做到这一点?

【问题讨论】:

  • 是的,您可以使用会话或视图状态。永远不要使用静态字段,因为每个请求(用户)的值都是相同的。
  • 请勿使用Session 变量,除非您需要跨页面保留值。如果您的关注仅限于特定页面,则使用 ViewState 变量(包装在属性中以便于使用),而不是 Session 变量。使用会话变量涉及多个问题,最好尽可能避免。
  • 谢谢@TimSchmelter,我知道静态变量具有应用程序范围。你能告诉我你提到@PradeepKumar 的问题吗?
  • 会话变量的通用名称如 a,b,c 或 i,j,k 等可以被其他页面无意识地修改,您将很难调试您的代码。此外,会话变量会遇到超时问题,ViewStateHidden Field 是免疫的,因为它们是往返的。此外,一旦不再需要会话变量,就很难清理它们。例如您导航到另一个页面,但您的会话变量仍然存在。
  • 非常感谢@PradeepKumar

标签: c# asp.net


【解决方案1】:

Session 是存储值的好主意。 会话存储在服务器上,因此不能被篡改。

请注意,会话的 ID 存储在您计算机上的 cookie 中。 但是,即使您禁用 cookie,您的 Session 仍然可以工作,因为您的 sessionID 将在您的 URL 中作为 QueryString 传递。

【讨论】:

  • 投反对票的人,请告诉我原因。
  • 有关否决票的解释,请阅读问题 cmets 部分中的我的 cmets。
【解决方案2】:

如果想在同一页面使用ViewState,可以如下使用

private int i
{
    get
    {
        return ViewState["i"] != null ? (int)ViewState["i"] : 0;
    }
    set
    {
        ViewState["i"] = value;
    }
}

并使用它

protected void next_Click(object sender, EventArgs e)
{
    i++;
}

protected void back_Click(object sender, EventArgs e)
{
    i--;
}

【讨论】:

    【解决方案3】:

    View State 是页面及其所有控件的状态。它由 ASP.Net 框架跨帖子自动维护。

    每次页面回发时,它基本上都是从头开始 - 例如,任何初始化为 0 的东西都将再次为零。这是因为服务器对页面上次运行的时间一无所知 - 它只知道您单击了一个向该页面提交表单的按钮。

    当页面被发送回客户端时,页面及其控件的属性更改将被确定并存储在名为 _VIEWSTATE 的隐藏输入字段的值中。当页面再次回发时,_VIEWSTATE 字段将与 HTTP 请求一起发送到服务器。

    Incrementing variables in ASP.net on button click@

    如果您需要跨回发保持一个值,标准方法 是使用ViewState:

    Public Property MyCounter() As Integer
        Get
            Dim val As Object = ViewState("MyCounter")
            Return If(val IsNot Nothing, CInt(val), 0)
        End Get
        Set(ByVal value As Integer)
            ViewState("MyCounter") = value
        End Set
    End Property
    

    也可以使用 Session,它将值持续存在 用户会话生命周期内的所有页面和请求。为此 工作,您可以使用上面相同的示例,将 ViewState 替换为 会话。

    【讨论】:

      【解决方案4】:

      是ajax按钮吗?

      如果不是,并且您尝试实现某种分页,这不是最好的解决方案。为什么不在查询字符串中发送新的 i 值?

      -在 url 路径中包含“i”值:

       /Page/<i> 
      

      而不是

      /Next
      

      等等

      如果是 ajax - 您仍然可以在请求正文或查询字符串中发送“i”值。

      【讨论】:

        【解决方案5】:

        假设您需要在多个页面上使用“i”的值:
        我建议您使用 Session 变量。
        http://msdn.microsoft.com/en-us/library/vstudio/ms178581(v=vs.100).aspx

        【讨论】:

          猜你喜欢
          • 2017-05-15
          • 2015-03-27
          • 1970-01-01
          • 2014-12-03
          • 2018-02-02
          • 1970-01-01
          • 2011-08-12
          • 2023-03-27
          • 1970-01-01
          相关资源
          最近更新 更多