不同客户端打开同一个包含静态变量的页面时,对这个静态变量的处理会互相干扰。但是,干扰的过程在如下一段看似简单的代码中有些困惑:cs页面:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;public partial class a : System.Web.UI.Page
{
static int abc;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
abc = 1;
}
Label1.Text = abc.ToString();
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
abc = Int32.Parse(DropDownList1.SelectedValue);
}
}aspx文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="a.aspx.cs" Inherits="a" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server"
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
AutoPostBack="True">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
<asp:ListItem>5</asp:ListItem>
</asp:DropDownList>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>现在的问题是:
如果分别从A、B两个客户端打开这个页面,A客户端不动,B客户端先选择2,然后选择3;这个过程中,A客户端会输出“1”,B客户端先输出“1”,后来输出“2”,这个可以理解,因为先输出静态变量,后把静态变量修正为选择的值嘛。1:可是,此时,如果刷新A页面,发现A页面输出的仍然是“1”,而不是“3”!按说此时已经B客户端已经把静态变量修正了啊。2:刷新完A之后,再去刷新B客户端,这时候,B客户端输出的是"1"!,也不是“3”,这个也很怪异,因为代码里边如果不选择下拉菜单,只是刷新一下,根本就不会改变那个静态变量啊,怎么客户端B的行为却明晃晃的表示静态变量被改变了?哪位来解释一下?多谢!
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;public partial class a : System.Web.UI.Page
{
static int abc;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
abc = 1;
}
Label1.Text = abc.ToString();
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
abc = Int32.Parse(DropDownList1.SelectedValue);
}
}aspx文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="a.aspx.cs" Inherits="a" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server"
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
AutoPostBack="True">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
<asp:ListItem>5</asp:ListItem>
</asp:DropDownList>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>现在的问题是:
如果分别从A、B两个客户端打开这个页面,A客户端不动,B客户端先选择2,然后选择3;这个过程中,A客户端会输出“1”,B客户端先输出“1”,后来输出“2”,这个可以理解,因为先输出静态变量,后把静态变量修正为选择的值嘛。1:可是,此时,如果刷新A页面,发现A页面输出的仍然是“1”,而不是“3”!按说此时已经B客户端已经把静态变量修正了啊。2:刷新完A之后,再去刷新B客户端,这时候,B客户端输出的是"1"!,也不是“3”,这个也很怪异,因为代码里边如果不选择下拉菜单,只是刷新一下,根本就不会改变那个静态变量啊,怎么客户端B的行为却明晃晃的表示静态变量被改变了?哪位来解释一下?多谢!
if (!IsPostBack)
{
abc = 1;
}
protected void Page_Load(object sender, EventArgs e)
{
if (abc == 0)
{
abc = 1;
}
Label1.Text = abc.ToString();
}
if (!IsPostBack)
{
abc = 1;
}
你打开第二个页面的时候和刷新第二个页面的时候(get刷新)把它设为1了,
那肯定怎么显示都是1, 由于是static的,又会影响第一个页面的值。所以第一个页面也变为1了。
if (!IsPostBack)
{
abc = 1;
}
你打开第二个页面的时候和刷新第二个页面的时候(get刷新)把它设为1了,
那肯定怎么显示都是1, 由于是static的,又会影响第一个页面的值。所以第一个页面也变为1了。
调试的时候,我看到刷新第二个页面的时候,没执行abc=1那句代码啊。
1. 刷新A,执行了f (!IsPostBack)
{
abc = 1;
} abc=1,2刷新B,由于bac=1了,所以B也显示1这很正常。
===============
第二个页面是没动,但A页面动过了。
刷新A ,abc=1重新刷新B
(
如果是重复提交,相当于重新选择下拉框,那么显示时abc=1,显示后,abc=3了)
===============
第二个页面是没动,但A页面动过了。
==================================第一个页面,也不会动它啊,!IsPostBack了都....
刷新A ,abc=1
======================刷新A,abc怎么会等于1呢,根本不会执行那个赋值语句啊,我断点调试过的。
======
虽然提交后abc=3了,但是显示的时候即Page_Load的时候还是1(这个1是你刷新A页面的时候设的)
==========>
因为你A没有动过下拉框,再刷新肯定会执行abc=1
if (!this.IsPostBack)
{
abc=1;
Response.Write("abc=1");
}看看刷新A时执不执行。
当前页面解决这个问题用ViewState来解决,跨页面用Session
Web程序里面没有全局变量的概念,定义这种静态变量在Web页
里面是不太可能实现你所想要的功能。