[英]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.