我写了一个ASPX c#页面,我必须使用这样的全局变量;
public static Decimal _Total;
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack == false)
{
_Total=0;
}
}
public void ShowCekBanka()
{
_Total= 10 * 5;
}
public void ShowNakitBanka()
{
_Total= 10 * 10;
}
现在;我在页面中放了2个按钮; Button1运行ShowCekBanak()函数; Button2运行ShowNakitBanka()函数;
当我第一次运行项目时,我单击Button1并且_Total是= 50就可以了; 但是我在另一个Internet Explorer中打开我的项目我在新打开的页面中看到我的_Total值为50。所以问题是全局变量_Total太全球了:) 两个Internet Explorer页面显示_Total中的SAME值都是_Totals是50; 一定是这样的;第一页_Total是50 OK,但新IE页必须_Total为0; 不是吗?
那我该如何解决这个问题呢? 谢谢;
答案 0 :(得分:3)
静态变量对应用程序是全局的。使用asp.net,只有一个应用程序实例,它由Web服务器和所有用户浏览器共享运行。作为d。提到有各种方法来维护状态,如果这是你所追求的,其中一个是viewstate,其他选项是隐藏字段和页面上下文对象。
Article (albeit a bit old) on asp.net state
Sohnee的回答是asp.net编程中一个非常常见的误解,并导致一些NIGHTMARE调试。基本上你一直在开发你的应用程序,它将适合你。然后,当您获得合理数量的访问者时(即一旦它上线),您会发现客户或测试人员报告非常严重且结果不一致。页面上的静态变量对于该页面的所有实例都是全局的 - 这意味着所有浏览器都访问该页面。我修改了他的例子,为它添加了一些睡眠,这样我们就可以模拟在实时服务器上可能发生的事情(即滞后)。
public partial class _Default : System.Web.UI.Page
{
public static Decimal _Total;
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack == false)
{
_Total = 0;
TextBox1.Text = _Total.ToString();
}
}
public void ShowCekBanka(object sender, EventArgs e)
{
_Total = 10 * 5;
System.Threading.Thread.Sleep(5000);
TextBox1.Text = _Total.ToString();
}
public void ShowNakitBanka(object sender, EventArgs e)
{
_Total = 10 * 10;
System.Threading.Thread.Sleep(5000);
TextBox1.Text = _Total.ToString();
}
}
如果您现在打开两个浏览器窗口然后在一个屏幕中点击一个按钮而在另一个屏幕中点击另一个按钮并等待几秒钟,您将看到它们在其文本框中报告相同的结果。难以解释......但希望有所帮助。
答案 1 :(得分:2)
公共静态变量的行为与此类似。如果你想要的是在页面回发期间保持_Total的值,请考虑以下
public decimal _Total {
get { return (decimal) ViewState["_total"]; }
set { ViewState["_total"] = decimal; }
}
答案 2 :(得分:0)
如果您按CTRL + N来获取新窗口,您将看到此行为。如果你从fresh打开一个全新的窗口,那么转到URL,你不应该看到这个。
我几乎完全测试了你的代码,并没有在两个完全独立的浏览器窗口之间保留_Total的值。这是您的代码,稍作调整。
public static Decimal _Total;
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack == false)
{
_Total = 0;
TextBox1.Text = _Total.ToString();
}
}
public void ShowCekBanka(object sender, EventArgs e)
{
_Total = 10 * 5;
TextBox1.Text = _Total.ToString();
}
public void ShowNakitBanka(object sender, EventArgs e)
{
_Total = 10 * 10;
TextBox1.Text = _Total.ToString();
}
我运行页面并点击一个按钮以获得0以外的总数,然后打开一个新的浏览器,总数为0.
然后我运行页面并点击一个按钮以获得除0以外的总数,然后按下CTRL + N,然后总数被“预先填充”。
即便如此,我认为你对“静态”的使用是一种“VB-ism” - 试试没有,我认为你会没事的。