基本上,我在Default.aspx页面上有一个登录控件,我正在验证用户,并且在有效的用户名和密码上,我将它们导航到另一个页面Upload.aspx。
在Upload.aspx页面上,我想将用户名值存储在一个全局变量中,然后在SQL过程的数量中传递这个全局变量。
要获取页面Upload.aspx上的用户名值,我在page_load事件
下有此代码public partial class Upload : System.Web.UI.Page
{
public static string uname;
public static string un;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
un = HttpContext.Current.User.Identity.Name;
uname = un;
clsClass find_user_type = new clsClass();
user_Type = find_user_type.Find_UserType_Of(uname).Trim();
}
else
{
uname = un; //the first If condition will be true atleast 1st,
//so that one `un` is set i can copy it into `uname`
//when its postback
}
}
}
Find_UserType_Of(uname)是clsClass中的一个方法,它接受一个字符串参数(uname)。
现在,当我在本地计算机上运行服务器是本地主机时,此代码运行正常。但是当我将它上传到网络服务器时,它开始表现得很有趣并告诉我
中的程序Find_UserType_Of(UNAME) 方法需要一个未传递的参数!
任何想法,发生了什么?
由于
答案 0 :(得分:4)
您最大的问题是变量上的static
,这将导致其值发生变化,具体取决于页面上的人员,因为该变量是针对所有请求共享的。您没有在当地注意到,因为您是唯一提出请求的人:
public static string uname;
public static string un;
应该是
private string uname;
private string un;
我可以在Ajax PageMethod accessing page-level private static property
的回复中找到更多解释您可能还想要read this on private variables以及相关的:Why should I use a private variable in a property accessor?
更新:您在回发时也遇到问题,因为您没有设置un
的值。回发后,您仍需要设置un
,或者只使用HttpContext.Current.User.Identity.Name
。
答案 1 :(得分:0)
对ASP.NET应用程序的每个请求都会创建System.Web.UI.Page
的新实例,在本例中为Upload
。这意味着每个变量必须在每个请求上设置,它将使用它。您可以使用ViewState
来解决此限制,使您的网页表现得像状态一样。
或者,对于全局变量,使用Application
字典:Application["uname"] = HttpContext.Current.User.Identity.Name
或对于用户,使用Session
字典Session["uname"] = HttpContext.Current.Identity.Name
。