0

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

任何想法,发生了什么?

谢谢

4

2 回答 2

4

你最大的问题是static你的变量,这将导致它的值发生变化,这取决于页面上的谁,因为该变量是为所有请求共享的。您没有在本地注意到,因为您是唯一提出请求的人:

public static string uname;
public static string un;

而应该是

private string uname;
private string un;

更多解释可以在我在Ajax PageMethod 访问页面级私有静态属性的回复中找到

您可能还想阅读有关私有变量以及相关的内容:Why should I use a private variable in a property accessor?

更新:您在 Postback 上也有问题,因为您没有设置un. 回发后,您仍然需要设置un,或者只需使用HttpContext.Current.User.Identity.Name.

于 2013-01-08T18:26:05.463 回答
0

在这种情况下,ASP.NET应用程序的每个请求都会创建. 这意味着必须在每个将使用它的请求上设置每个变量。您可以通过使用使您的网页表现得像它有状态一样来解决这个限制。System.Web.UI.PageUploadViewState

或者,对于全局变量,使用Application字典:Application["uname"] = HttpContext.Current.User.Identity.Name或者对于用户,使用Session字典Session["uname"] = HttpContext.Current.Identity.Name

于 2013-01-08T19:10:50.550 回答