C# 获取集属性c的问题#

C# 获取集属性c的问题#,c#,asp.net,C#,Asp.net,我被这件事缠住了,我真的要在几分钟内把头撞到墙上 我有一个日志页面,用户在其中输入用户名和密码,并在按下此按钮时单击登录。将调用一个函数来获取所有用户详细信息,即firstname姓氏Email AccountType Examtaken等,我试图在函数中设置“get;set;”属性,以便我可以在主页上使用它们,但出于我不知道的愚蠢原因,它不起作用!下面您将看到当用户单击login时调用的方法 public class ExamMethods { public int UserID {

我被这件事缠住了,我真的要在几分钟内把头撞到墙上 我有一个日志页面,用户在其中输入用户名和密码,并在按下此按钮时单击登录。将调用一个函数来获取所有用户详细信息,即firstname姓氏Email AccountType Examtaken等,我试图在函数中设置“get;set;”属性,以便我可以在主页上使用它们,但出于我不知道的愚蠢原因,它不起作用!下面您将看到当用户单击login时调用的方法

public class ExamMethods
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public string Email { get; set; }
    public int AccountType { get; set; }
    public bool ExamTaken { get; set; }

    private enum Datafield
    {
        UserID,
        FirstName,
        Surname,
        Email,
        AccountType,
        ExamTaken,
    }


    public Hashtable CheckLogin(Hashtable Usercredentials)
    {
        try
        {
            SqlConnection Connection = new SQLAccess().CreateConnection();
            SqlCommand Command = new SqlCommand("GetUserDetails", Connection);
            Command.CommandType = System.Data.CommandType.StoredProcedure;
            foreach (DictionaryEntry SpParameter in Usercredentials)
            {
                Command.Parameters.Add(new SqlParameter(SpParameter.Key.ToString(), SpParameter.Value.ToString()));
            }
            SqlDataReader da = Command.ExecuteReader();

            while (da.Read())
            {
                Details.Add("UserID", da["UserID"]);
                UserID = (da.IsDBNull((int)Datafield.UserID)) ? 0 : da.GetInt32((int)Datafield.UserID);
                Details.Add("FirstName", da["FirstName"]);
                FirstName = (da.IsDBNull((int)Datafield.FirstName)) ? "" : da.GetString((int)Datafield.FirstName);
                Details.Add("Surname", da["Surname"]);
                Surname = (da.IsDBNull((int)Datafield.Surname)) ? "" : da.GetString((int)Datafield.Surname);
                //Details.Add("AccountType", da["AccountType"]);
                //AccountType = (da.IsDBNull((int)Datafield.AccountType)) ? 0 : da.GetInt32((int)Datafield.AccountType);
                //Details.Add("ExamTaken", da["ExamTaken"]);
                //ExamTaken = (da.IsDBNull((int)Datafield.ExamTaken)) ? false : da.GetBoolean((int)Datafield.ExamTaken);
            }
            Connection.Close();
            da.Close();
            return Details;
        }
        catch
        {
            Console.WriteLine("Error Checking Login Details");
            return Details;
        }
    }
}
正如您在上面的while(da.read)中看到的,我在调试时将值分配给哈希表和get set方法,我可以看到值进入!im 100%此值不为null或空

然后,代码返回到登录页面,如果一切正常,则返回response。重定向到用户可以参加考试的主页,但在home.aspx的页面加载中,我有一个标签,我想用用户名弹出,因此我引用ExamMethods类上的get属性,但它为null?这怎么可能呢?我错过了什么? 这是back home.aspx页面的代码

  public partial class Home : System.Web.UI.Page
    {

       Hashtable UpdateUser = new Hashtable();
       protected void Page_Load(object sender, EventArgs e)
       {
           Methods.ExamMethods obj_UserDetails = new Methods.ExamMethods();
           if (Request.QueryString["uid"] == null)
           {
               Response.Redirect("Login.aspx");
           }
           else
             lblUserName.Text = obj_UserDetails.FirstName;

       }

是因为我使用了从登录页到主页的reponse.redirect,所以get set方法什么都不是?

在处理网页时,网页之间不会共享变量。您可能知道HTTP是一种无状态协议

那我该怎么做呢

你需要国家管理。你需要一种传递信息的方式。据我所见,似乎是存储这些数据的最佳位置,您需要在多个页面中使用这些数据

但会话并不是唯一的状态管理选项。根据您要存储的内容、存储的数量以及访问它们的位置/时间,您还有更多


我建议您仔细阅读,也要仔细阅读,了解在哪种情况下使用哪种状态管理功能。

Page\u Load
方法中,您每次都在创建
方法的新实例。ExamMethods()
,因此它的所有属性都不会初始化。重定向到登录页面后,执行登录并重定向回,
page\u Load
再次执行,并创建该类的新实例

当您在
QueryString
中定义了用户数据时,最好的方法是基于
uid
从数据库中读取用户数据

protected void Page_Load(object sender, EventArgs e)
{
    Methods.ExamMethods obj_UserDetails = new Methods.ExamMethods();

    if (Request.QueryString["uid"] == null)
    {
        Response.Redirect("Login.aspx");
    }
    else
    {
        if (!Page.IsPostback)
        {
            //read value of uid parameter
            int uid = Request.QueryString["uid"];
            //access database to retrieve user's details
            obj_UserDetails = GetUserDetails(uid);
            lblUserName.Text = obj_UserDetails.FirstName;
        }
    }

}
您可以使用
Page.IsPostback
属性用用户数据填充控件,这也是值得的。在回发
ViewState
时,机制应保留控件的内容

还有一些其他机制允许您在页面之间传递数据,如会话状态。如果您需要更多页面上的用户详细信息,而不仅仅是这两个页面,则可以使用此选项。这样,您就不必经常访问数据库

使用
Server.Transer()
方法将用户重定向到另一个页面,使用
PreviousPage
对象也可以访问其他页面,但我认为使用
QueryString
和直接在主页上读取数据最适合您的情况

有帮助的链接:


当您浏览web页面时,实例不会保持活动状态,您可以在会话中存储所需的内容,并在加载新页面时获取 您可以在需要存储数据时执行此操作

Session["data"] = new Data("SomeData");
当你再次需要数据时,你可以这样做

var data = Session["data"] as Data;
if(data != null)
//do something with the data

看到了吗,当我从一个页面转到另一个页面时,我想是这样的,我会看看那个链接,谢谢你提供的信息。我是否错过了你实际调用的
CheckLogin
?当你不调用你所询问的方法时,很难说出哪里出了问题。我尽量不调用服务器,这样在我看来性能会更好,但我对你提供的代码片段感兴趣,但是我确实有一个问题,如果有意义的话,我如何将其声明为一个全局会话?例如,我刚刚调用了服务器以获取信息。当我被发送到主页时,我向该页面上的会话变量添加了详细信息。我如何引用位于“方法”页面上的会话变量?我不知道你真正的意思,您可以从de会话中获取数据,并对其进行操作,或者向其中添加数据,当您准备就绪时,您可以再次向会话中添加取消操作的变量