static变量的一个问题
代码如下:
public static String photoId=""; protected void Page_Load(object sender, EventArgs e)
{
lblUserName.Text = Session["UserName"].ToString();
if (!IsPostBack)
{
this.GetFileData();
}
}
public void GetFileData()
{
using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("photo.mdb")))
{
conn.Open();
OleDbDataAdapter os = new OleDbDataAdapter("select * from tb_photo where photoUser='" + Session["UserName"].ToString() + "' order by id desc", conn);
DataSet ds = new DataSet();
os.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
GridView1.DataSource = ds.Tables[0];
GridView1.DataKeyNames = new String[] { "ID" };
GridView1.DataBind();
}
}
using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("photo.mdb")))
{
conn.Open();
OleDbDataAdapter oa = new OleDbDataAdapter("select * from tb_photo order by id desc",conn);
DataSet ds = new DataSet();
oa.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
photoId = (Convert.ToInt32(ds.Tables[0].Rows[0][0]) + 1).ToString();
}
else
{
photoId = "0";
}
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
String path = fu.PostedFile.FileName;
String ext = path.Substring(path.LastIndexOf(".") + 1);
if (ext.ToLower() == "jpg" || ext.ToLower() == "bmp" || ext.ToLower() == "gif" || ext.ToLower() == "png" || ext.ToLower() == "tif")
{
String spath = Server.MapPath("Photo\" + photoId + "." + ext);
path = photoId;
Response.Write(path);}
这里非要设置photoId为 static 否者 最后的path 值为空 也就是 photoId的值传不到path 解释下为什么
[最优解释]
每次引起page重新加载,里面的变量都会初始化,二static是全局的,你可以使用session来保存变量
[其他解释]
http是无状态的。每当你请求完这个页面,Socket连接就会断开,页面对象就会销毁。
再次去请求时,会重新创建页面类对象,所以即使是全局变量也会重新创建。
点击btnSave的时候,页面产生了PostBack,所以再次请求了该页面对象,因此photoId会恢复为默认值(string的默认值为null)。
如果是同一个页面,可以用VisewState保持状态
多个页面间可以用Cookie(客户端)或者Session(服务端)
整个应用程序集可以用Application
[其他解释]
主要原因就是页面的生命周期的,
如果这个变量只要在当前页面使用的话,可以放到ViewState里面,如
ViewState["path"] = "hello world";
string path = ViewState["path"].ToString();