获取设置属性的问题c#

时间:2012-04-21 17:37:35

标签: c# asp.net

我坚持这一点,我真的会在几分钟内撞到墙上 我有一个日志页面,用户在那里输入用户名和密码并点击登录,当他们按下这个函数被调用以获取所有用户详细信息,即姓名姓氏电子邮件帐户类型检查等功能我试图设置“获取;设置; “属性,所以我可以在主页上使用它们,但由于一些愚蠢的原因,我不知道它不工作!在下面,您将看到用户单击登录时调用的方法

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%这个值不为空或空

代码然后恢复到登录页面,如果一切正常,则response.redirect到用户可以参加考试的主页,但是在home.aspx的页面加载中我有一个标签我想用用户名popualte所以我在ExamMethods类上引用了get propertyie但是它的null?这怎么可能?我错过了什么? 这是后面的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;

       }

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方法什么都没有?或者我是愚蠢的,看起来也是c#的新东西,所以请光临我,任何帮助都将非常感激。 谢谢。

3 个答案:

答案 0 :(得分:7)

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

那我该怎么做?

您需要国家管理。您需要一种方法来传递信息。从我看到的情况来看,Sessions似乎是存储您需要在多个页面中使用的数据的最佳位置。

但是会话不是您拥有的唯一州管理选项。根据您要存储的内容,要存储的内容以及您希望访问它们的位置/时间,还有更多内容。

我建议您阅读ASP .NET State Management,同时阅读recommendations,了解在哪种情况下使用哪种状态管理功能。

答案 1 :(得分:3)

Page_Load方法中,您每次都会创建一个Methods.ExamMethods()的新实例,因此所有其特性都未初始化。重定向到登录页面后,执行登录并重定向,再次执行Page_Load并创建该类的新实例。

如果在uid中定义了用户的数据,只需在QueryString中根据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对象也可以访问其他页面,但我想使用{{1}}并直接在 Home 页面将是您最合适的。

可能有用的链接:

答案 2 :(得分:1)

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

Session["data"] = new Data("SomeData");

您可以在需要数据时执行此操作

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