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#的新东西,所以请光临我,任何帮助都将非常感激。 谢谢。
答案 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