【问题标题】:Issue With Get Set Properties c#获取设置属性c#的问题
【发布时间】:2012-04-21 17:37:35
【问题描述】:

我坚持这一点,我真的要在几分钟内把我的头撞到墙上 我有一个日志记录页面,用户在其中输入用户名和密码,并在按下此按钮后单击登录,调用一个函数以获取所有用户详细信息,即名字姓氏电子邮件帐户类型考试等在我试图设置“获取;设置; "属性,所以我可以在主页上使用它们,但由于某些愚蠢的原因,我不知道它不起作用!下面你会看到用户点击登录时调用的方法

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 的页面加载中,我有一个标签我想用用户名填充,所以我引用了 ExamMethods 类上的 get 属性,但它为空?这怎么可能?我错过了什么? 这是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方法什么都没有?

【问题讨论】:

  • 我错过了你实际打电话给CheckLogin 的地方吗?当您不调用您要询问的方法时,很难说出了什么问题。

标签: c# asp.net


【解决方案1】:

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

那么我该怎么做呢?

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

但会话并不是您拥有的唯一状态管理选项。您还有更多,具体取决于您要存储的内容、要存储的数量以及要在何处/何时访问它们。

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

【讨论】:

  • 看到我以为是这种情况,因为我从一页转到另一页,我看看那个链接谢谢你的信息。
【解决方案2】:

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 机制应该保留控件的内容。

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

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

可能有用的链接:

【讨论】:

    【解决方案3】:

    当您浏览网络上的页面时,实例不会保持活动状态,您可以将所需的内容存储在会话中并在新页面加载时获取 当你需要存储数据时可以这样做

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

    当你再次需要数据时可以这样做

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

    【讨论】:

    • 我尽量不调用服务器,这样在我看来性能会更好,我对你提供的 sn-p 感兴趣,但我确实有一个问题我声明它是一个全局会话,如果这有意义,例如 iv 刚刚完成对服务器的调用以获取信息,当我被发送到主页时,我将详细信息添加到该页面上的会话变量我如何引用会话位于方法页面上的变量?
    • 我不知道你真正的意思,你可以从de Session中获取数据,并对其进行操作,或者添加数据,当你准备好时,你可以添加de操作变量再次参加会议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多