【问题标题】:Increment value not going above 2增量值不超过 2
【发布时间】:2014-05-26 09:49:49
【问题描述】:

我试图在按钮单击事件上将整数值增加 1,但是当我单击它时,它第一次递增并保持不变,例如它不会递增到 3。

public partial class Form : System.Web.UI.Page
{
    int num = 1;

    protected void Page_Load(object sender, EventArgs e)
    {

        Label_PageNumber.Text = "Page0" + num.ToString();

    }



    protected void Button1_Click(object sender, EventArgs e)
    {
        num++;

        Label_PageNumber.Text = "Page0" + num.ToString();

    }
}

【问题讨论】:

  • 你提到了num = 1,所以每次都是一个。
  • 本地字段不会跨不同请求持久化(Form 实例在请求结束后被回收)。您真的很想了解一下 Web 开发与桌面开发的不同之处(很多)。

标签: c# asp.net


【解决方案1】:

全局变量在PostBack上初始化,之前的值丢失了,如果你想要PostBack之间的值,可以使用ViewState

public partial class Form : System.Web.UI.Page
{       
    public int Num
    {
         get {
                if(ViewState["num"] != null)
                   return int.Parse(ViewState["num"]); 
                else
                   return 0;  
              }
         set { ViewState["num"] = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {    
        Label_PageNumber.Text = "Page0" + Num.ToString();    
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Num++;    
        Label_PageNumber.Text = "Page0" + Num.ToString();    
    }
}

由于 Http 是无状态协议,全局变量的值会丢失。

一个stateless protocol (Http)不需要HTTP服务器保留 在多个持续时间内有关每个用户的信息或状态 要求。但是,一些 Web 应用程序实现了状态或服务器 使用例如 HTTP cookie 或隐藏变量的侧会话 在网络表单中。

View state 是 ASP.NET 页面中的存储库,可以存储回发期间必须保留的值。页面框架使用视图状态在回发之间保持控制设置。

  • 您可以在自己的应用程序中使用视图状态来执行以下操作:

  • 在回发之间保留值,而不将它们存储在会话状态或用户配置文件中。

  • 存储您定义的页面或控件属性的值。

【讨论】:

    【解决方案2】:

    问题是当你点击 Button 时,会生成一个 PostBack,然后你的计数器会设置为 1。使用 Sessions 来存储你当前的值!

    public partial class _Default : System.Web.UI.Page 
    {
        int num;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                num = 1;
                Session["number"] = num;
                Label_PageNumber.Text = "Page0" + num.ToString();
            }
            else
            {
                num = (int)Session["number"];
            }      
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            num++;
            Session["number"] = num;
            Label_PageNumber.Text = "Page0" + num.ToString();
        }
    }
    

    【讨论】:

      【解决方案3】:

      代码中的一个简单更改,将 int 变量设为静态:

      public partial class Form : System.Web.UI.Page
      {
       static int num = 1;
      
      protected void Page_Load(object sender, EventArgs e)
      {
      
          Label_PageNumber.Text = "Page0" + num.ToString();
      
      }
      
      
      
      protected void Button1_Click(object sender, EventArgs e)
      {
          num++;
      
          Label_PageNumber.Text = "Page0" + num.ToString();
      
      }
      

      }

      【讨论】:

      • 是什么让static 变量不能在PostBack 上重新初始化其值?
      【解决方案4】:

      ASP.Net 是无状态的;这意味着您无法存储诸如 win 表单之类的字段。正如 Adil 所说,您可以使用视图状态来存储值。另一种选择是使用Session。使用Session 代替ViewState 有一些优势。

      首先,您的页面会更轻,因为视图状态值嵌入在页面中。

      其次,Session 更安全,因为它保留在服务器中,但是,视图状态值被发送到客户端。

      第三,当您转到另一个页面时,您将丢失视图状态值。实际上,您将在新页面中拥有上一页的字段(在某些情况下可能是不利的)。

      你应该知道微软在没有ViewSate 的情况下引入了 ASP.NET MVC。

      【讨论】:

        猜你喜欢
        • 2014-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多