2014-10-29 69 views
0

我正在开发一个asp.net应用程序。我有一个名为“home.aspx”的页面,其中包含2个名为“button1”和“button2”的按钮。每个按钮都有一个onclick方法,分别称为“Button1_click”和“Button2_click”。我的目标是分享这2种方法之间的公共变量,所以基本上我试图将属性添加到这样的关联到我的网页类:在asp.net应用程序中共享一个全局变量到一个类

public partial class Home : Syste.Web.UI.Page 
{ 
    private int myproperty=0; 

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

    protected void Button2_Click(object sender, EventArgs e) 
    { 
     myproperty++; 
    } 
} 

有了这个代码,我想的是,“私人诠释myproperty = 0“只会在我第一次加载并进入页面时调用。然后当我在页面上时,如果我点击button1或button2,myproperty只会增加一个。但是当我调试时,我发现每次单击button1或button2时,都会再次调用“private int myproperty = 0”,这是我不明白的。有没有人有解决方案?

在此先感谢您的帮助。

+0

像'Page'这样的asp.net类只存在于请求的生存期内,每个请求都会创建一个新的实例。如果你想在请求之间存储信息,你必须将它存储在某个地方,如果它只在内存中,那么经常使用'Session',但要记住每个客户端都有自己的会话。 – 2014-10-29 11:11:01

回答

0

让你变static

像这样

public partial class Home : Syste.Web.UI.Page 
    { 
    private Static int myproperty; 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     //You can access myproperty here (same copy) 
    } 

    protected void Button2_Click(object sender, EventArgs e) 
    { 
     //You can access myproperty here (same copy) 
    } 
} 
+0

什么?那么ASP.NET中'Session'的需求是什么? – Rahul 2014-10-29 11:25:28

+0

会话对象适用于用户会话级别,应用程序对象适用于所有用户或整个应用程序,并且这适用于特定的页面级别。它将共享相同的数据副本。 – yogi970 2014-10-29 11:31:02

+0

不,这是一种错误的做法。您应该使用任何状态维护机制,而不是将其存储在'static'变量中。考虑阅读更多关于这个。 – Rahul 2014-10-29 11:32:58

1

在ASP.NET,如果你想使用全局变量,你必须使用Session对象(如果变量是不同的对于每个单个用户,例如计算用户点击某个按钮的次数)或Application对象(如果该变量对于所有用户都很常见,例如计算用户访问您的网站的次数)。 例子:

//Set variable 
Session["myVariable"] = value 
//Get variable 
var myVariable = Session["myVariable"] 

的语法是相等Application只是Application

0

您可以使用会话如下

private int Count 
{ 
    get 
    { 
    if (Session["Count"] == null) 
    {   Session["Count"] = 0; return 0;  } 
    else 
     return (int)Session["Count"] ; 
    } 
    set 
    { 
     Session["Count"] = value; 
    } 
} 

protected void Page_Load(object sender, EventArgs e)  
{ 
    if(!IsPostBack) 
     Count = 0; 
} 

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

protected void Button2_Click(object sender, EventArgs e) 
{ 
    Count++; 
} 
0

你怎么想分享的变量myProperty的价值取代Session

- 如果你想重用的myproperty每个窗口的值,你需要存储在vewstate值:http://msdn.microsoft.com/en-us/library/ms227551%28v=vs.85%29.aspx

另一种方法是使用asp.net三夏hiddenfiled存储值。

- 如果你想重新使用会话值,可以将该值在会话存储(会话[“myProperty的”])

- 如果你想与所有可以使用的用户共享价值应用程序:http://msdn.microsoft.com/en-us/library/94xkskdf%28v=vs.100%29.aspx

0

正如Ben Robinson所说,你必须坚持这个价值。 一个简单的方法是使用会话:

  1. 在类中创建一个“常量字符串”变量来保存,如会话指数:

    常量字符串MY_PROPERTY =“myProperty的”;

  2. 然后每当要存储或读出的值使用:

    //存储 会话[Home.MY_PROPERTY] = int.parse(会话[Home.MY_PROPERTY])+ 1; //读取 INT MYVARIABLE = int.parse(会话[Home.MY_PROPERTY])

你也可以创建你的类像一个属性:

const string MY_PROPERTY = "MyProperty"; 
public int MyProperty 
{ 
    get 
    { 
     if (Session[Home.MY_PROPERTY] == null) 
     { 
      return 0; 
     } 
     else 
     { 
      int iValue = 0; 
      if (int.TryParse(Session[Home.MY_PROPERTY].ToString(), out iValue)) 
       return iValue; 
      else 
       return 0; 
     } 
    } 
    set 
    { 
     Session[Home.MY_PROPERTY] = value; 
    } 
} 
0

只有回发检查,在增量之前,可以解决问题。 增量前添加以下代码。

if(!IsPostBack) 
相关问题