ASP.NET:HttpContext.Current.User.Identity.Name似乎在page_load上随机丢失了它的值

时间:2013-01-08 18:20:56

标签: c# asp.net login

基本上,我在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)   方法需要一个未传递的参数!

任何想法,发生了什么?

由于

2 个答案:

答案 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