ASP.Net C#变量未存储在网页上

ASP.Net C#变量未存储在网页上,c#,asp.net,visual-studio-2010,variables,cookies,C#,Asp.net,Visual Studio 2010,Variables,Cookies,所以我有密码 int var1 = 0; protected void cmdvar1_Click(object sender, EventArgs e) { var1= var1+ 10; lblvar1.Text = var1.ToString(); } 当点击这个,它是伟大的。。它取整数,加上10,然后显示。。然而,它不会显示超过10个,做了一些尝试,得出结论,这不是因为标签没有更新,它只是没有将10添加到变量的前10。我做错了什么?我错

所以我有密码

int var1 = 0;

protected void cmdvar1_Click(object sender, EventArgs e)
    {
        var1= var1+ 10;
        lblvar1.Text = var1.ToString();
    }

当点击这个,它是伟大的。。它取整数,加上10,然后显示。。然而,它不会显示超过10个,做了一些尝试,得出结论,这不是因为标签没有更新,它只是没有将10添加到变量的前10。我做错了什么?我错了什么?我是否需要将变量信息存储在cookie或其他东西中?

这是由于ASP.NET的生命周期造成的。在网页后面存储私有字段与WinForms的工作方式不同。如果要跨回发持久化信息,则需要将其存储在一些持久化存储中,即
会话
/
视图状态
/
数据库

private int var1 = 0;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // load var1 from cache
        Int32.TryParse((Session["var1"] ?? 0).ToString(), out var1);
    }
}

protected void cmdvar1_Click(object sender, EventArgs e)
{
    var1 += 10;
    Session["var1"] = var1; // cache var1
    lblvar1.Text = var1.ToString();
}

使用会话体,HTTP是无状态协议,回发后会丢失当前变量值

解决方案

int var1=0;
protected void cmdvar1_Click(object sender, EventArgs e)
    {

if(Session["var1"]!=null)
var1=int.Parse(Session["var1"].ToString());
else
var1=0;
        var1= var1+ 10;
        lblvar1.Text = var1.ToString();
Session["var1"]=var1;
    }

因此,我强烈建议寻找一个不同的平台。也许ASP.NETMVC。。。但是,您可以使用以下方法来解决您的问题

private int MyNum
{
   get{ return (int)ViewState["MyNum"] ?? 0; }
   set { ViewState["MyNum"] = value; }
}

然后使用MyNum作为递增的整数。

假设lblvar1是一个Label控件,则可以执行以下操作。这将起作用的原因是.NET自动处理UIControl的状态

protected void cmdvar1_Click(object sender, EventArgs e)
    {
        var var1 = Convert.ToInt32(lblvar1.Text);
        var1= var1+ 10;
        lblvar1.Text = var1.ToString();
    }

正如评论中所建议的,在生成有意义的web应用程序之前,您必须将您的世界包装为无状态

ASP.NET相当于完成类似状态的行为,即使用可用于每个网页的会话集合

protected void cmdvar1_Click(object sender, EventArgs e)
{
   int var1 = (int)Session["yourInteger"];
   var1 += 10;
   Session["yourInteger"] = var1;
   lblvar1.Text = var1.ToString();
}
很明显,您正在为会话[“yourInteger”]在其他地方设置初始值,只设置了一次


会话的问题在于,它使您的应用程序可能有缺陷,并且有些不可扩展。您使用它的次数越多,这两个帐户的情况就越糟。

您的帐户正在陷入无状态!一旦网页被呈现并交付给客户端,它就结束了。您必须跟踪变量的状态。这意味着使用隐藏的表单字段、查询字符串、cookie等。如果您使用WebForms,ViewState可以在文本框等中保存值。与WinForm相比,这真的是一个完全不同的世界。您需要使用类似于
Session
ViewState
的东西,或者可能使用数据库来在回发之间保留值。根据数据是什么、如何使用以及它需要“生存”多长时间,将帮助您确定哪种方法是合适的。使用会话:IMHO,这应该是一个注释,除非您准备提供一个使用
Session
ViewState
跟踪变量的示例…@James,在
IsPostback
检查之后,检查session变量是否不是
null将是一件好事,我认为如果“MyNum”,这将抛出一个异常was
null
,因为您无法将
null
强制转换为
int
。我不建议采用这种方式,因为缓存页返回过期数据可能会出现问题。+1用于解释HTTP是无状态协议。很多人并不真正理解协议是如何工作的。若他们这样做了,那个可以帮助他们更好地理解很多事情,比如POST/GET发生时会发生什么,等等。