不同客户端打开同一个包含静态变量的页面时,对这个静态变量的处理会互相干扰。但是,干扰的过程在如下一段看似简单的代码中有些困惑: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的行为却明晃晃的表示静态变量被改变了?哪位来解释一下?多谢!

解决方案 »

  1.   

    Web 程序是无状态的。statics 变量貌似无效。
      

  2.   

    你的问题出在这里.
    if (!IsPostBack) 
            { 
                abc = 1; 
            } 
      

  3.   

    你再试:     static int abc=  0;
            protected void Page_Load(object sender, EventArgs e)
            {
                if (abc == 0)
                {
                    abc = 1;
                }
                Label1.Text = abc.ToString();
            }
      

  4.   

    没解决问题啊,我关心的是为什么回答导致那两个问题中的古怪结果,A客户端只是刷新,不选择下拉菜单的值,却总能把abc改为1;B客户端选择下拉菜单的值,明明修改了abc的值,A客户端却不显示修改以后的结果?
      

  5.   

    cpp2007,你加入一个abc==0,的确能解决那两个怪现象,但是能不能说说为什么原来的代码会出现哪些问题?
      

  6.   

    看来非得让我手把手了。
    if (!IsPostBack) 
            { 
                abc = 1; 
            } 
    你打开第二个页面的时候和刷新第二个页面的时候(get刷新)把它设为1了,
    那肯定怎么显示都是1, 由于是static的,又会影响第一个页面的值。所以第一个页面也变为1了。
      

  7.   

    看来非得让我手把手了。 
    if (!IsPostBack) 
            { 
                abc = 1; 
            } 
    你打开第二个页面的时候和刷新第二个页面的时候(get刷新)把它设为1了, 
    那肯定怎么显示都是1, 由于是static的,又会影响第一个页面的值。所以第一个页面也变为1了。 
    调试的时候,我看到刷新第二个页面的时候,没执行abc=1那句代码啊。
      

  8.   

    也就是说你第二个页面是get刷新即!IsPostBack,肯定会执行abc=1
      

  9.   

    而且,我刷新第二个页面的时候,第二个页面显示的也不是"1”,这应该能说明其实第二个页面在选择选项的时候根本没有动过abc=1那个代码,不是么?我有些笨,呵呵。
      

  10.   

    1:可是,此时,如果刷新A页面,发现A页面输出的仍然是“1”,而不是“3”!按说此时已经B客户端已经把静态变量修正了啊。 2:刷新完A之后,再去刷新B客户端,这时候,B客户端输出的是"1"!,也不是“3”,这个也很怪异,因为代码里边如果不选择下拉菜单,只是刷新一下,根本就不会改变那个静态变量啊,怎么客户端B的行为却明晃晃的表示静态变量被改变了? ============
    1. 刷新A,执行了f (!IsPostBack) 
            { 
                abc = 1; 
            } abc=1,2刷新B,由于bac=1了,所以B也显示1这很正常。
      

  11.   

    而且,我刷新第二个页面的时候,第二个页面显示的也不是"1”,这应该能说明其实第二个页面在选择选项的时候根本没有动过abc=1那个代码,不是么? 我有些笨,呵呵。
    ===============
    第二个页面是没动,但A页面动过了。
      

  12.   

    就看A和B吧,因为我测试的时候第一个和你第二个不同顺序。根据你的测试顺序。应该这样打开A,B此时abc=1B中选择3 abc=3 
    刷新A ,abc=1重新刷新B
    (
     如果是重复提交,相当于重新选择下拉框,那么显示时abc=1,显示后,abc=3了)
      

  13.   

    而且,我刷新第二个页面的时候,第二个页面显示的也不是"1”,这应该能说明其实第二个页面在选择选项的时候根本没有动过abc=1那个代码,不是么? 我有些笨,呵呵。 
    =============== 
    第二个页面是没动,但A页面动过了。 
    ==================================第一个页面,也不会动它啊,!IsPostBack了都....
      

  14.   

    就看A和B吧,因为我测试的时候第一个和你第二个不同顺序。 根据你的测试顺序。应该这样 打开A,B 此时abc=1 B中选择3 abc=3 
    刷新A ,abc=1 
    ======================刷新A,abc怎么会等于1呢,根本不会执行那个赋值语句啊,我断点调试过的。
      

  15.   

    我说的刷新就是点击浏览器那个刷新按钮,B客户端里还包括了重新发送信息那个按钮。
    ======
    虽然提交后abc=3了,但是显示的时候即Page_Load的时候还是1(这个1是你刷新A页面的时候设的)
      

  16.   

    刷新A,abc怎么会等于1呢,根本不会执行那个赋值语句啊,我断点调试过的。
    ==========>
    因为你A没有动过下拉框,再刷新肯定会执行abc=1
      

  17.   

    这样吧,你在这里加一句。
        if (!this.IsPostBack)
                {
                   abc=1;
                  Response.Write("abc=1");
                }看看刷新A时执不执行。
      

  18.   


    当前页面解决这个问题用ViewState来解决,跨页面用Session
    Web程序里面没有全局变量的概念,定义这种静态变量在Web页
    里面是不太可能实现你所想要的功能。
      

  19.   

    对cpp2017的解释一直没理解出于我一直误以为浏览器的刷新按钮就意味着IsPostBack了,呵呵,你没急躁是我错了。Junkie-Xl,你说的很有道理,ViewState是个很好的路子,我只是想搞明白1楼那个问题而已,谢谢你,可惜没分了,否则一定给你,呵呵。