繁体   English   中英

获取集属性c#的问题

[英]Issue With Get Set Properties c#

我坚持了这一点,我真的会在几分钟之内把我的头撞到墙上。我有一个登录页面,用户在此处输入用户名和密码,然后在他们按下此按钮后单击登录,就会调用一个函数来获取所有用户详细信息,即尝试设置“获取;设置;”功能中的名字等姓电子邮件帐户类型 属性,以便我可以在主页上使用它们,但是由于某些愚蠢的原因,我不知道它不起作用! 在下面,您将看到用户单击登录时调用的方法

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方法,我可以看到值输入了! 我100%表示此值不为null或为空

然后,代码返回到登录页面,如果一切正常,则返回结果。response.redirect到用户可以进行考试的主页,但是在home.aspx的页面加载中,我有一个标签,我想用户名popualte,所以我引用了ExamMethods类的get属性,但它为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;

       }

是因为我使用了从登录页面到主页的reponse.redirect的get set方法无效吗?

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

那么我该怎么做呢?

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

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

我建议您阅读ASP.NET状态管理,也阅读建议以了解在哪种情况下使用哪种状态管理功能。

Page_Load方法中,您每次都在创建一个Methods.ExamMethods()的新实例,因此不会初始化其所有属性。 重定向到登录页面后,执行登录并被重定向回,再次执行Page_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机制应保留控件的内容。

还有其他一些机制可让您在页面之间传递数据,例如Session state 如果您需要更多页面上的用户详细信息而不仅仅是那两个页面,可以使用此方法。 这样,您就不必经常访问数据库。

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

可能有用的链接:

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

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

当您再次需要数据时可以执行此操作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM