Code Ratchet
Code Ratchet

Reputation: 6029

Issue With Get Set Properties c#

im stuck with this and im really going to bang my head against a wall in a minutes I have a logging page where the user enters there username and password and clicks login when they have pressed this a function is called to get all the user details i.e firstname surname Email AccountType Examtaken etc within the function im trying to set "Get; Set;" Properties so i can use them on the home page, but for some stupid reason un-known to me its not working! below you will see the method that is called when the user clicks login

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;
        }
    }
}

as you can see from the above in the while(da.read) im assigning the values to a hashtable and the get set methods when debuggin i can see values going in! and im 100% this values arent null or empty

the code then reverts back to the login page with it results if all is fine then response.redirect to the home page where the user can take the exam, but in the page load of the home.aspx i have a label which i want to popualte with the users name so i reference the get propertie on the ExamMethods class but its null? how can this be possible? what am i missing? This is the code for the behind home.aspx page

  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;

       }

Is it because I have used reponse.redirect from the login page to the home page that the get set methods are nothing?

Upvotes: 0

Views: 795

Answers (3)

Jude Cooray
Jude Cooray

Reputation: 19862

Variables aren't shared among web pages when you are working with web pages. As you might know HTTP is a stateless protocol.

So how do I do this?

You need state management. You need a way to pass the information around. From what I see, Sessions seems to be best place to store this data that you require to use in multiple pages.

But sessions are not the only state management option you have. You have many more depending on what you want to store, how much you want to store and where/when you want to access them.

I suggest you read up on ASP .NET State Management also read up on recommendations to understand which state management feature to use in which scenario.

Upvotes: 7

Lukasz M
Lukasz M

Reputation: 5723

In Page_Load method you're creating a new instance of Methods.ExamMethods() each time so all of its properites are not initialized. After you are redirected to login page, perform login and are redirected back, Page_Load is executed again and a new instance of the class is created.

The preffered way of doing it would be just reading user's data from database based on uid when you have it defined in theQueryString.

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;
        }
    }

}

It's also worth monetioning that you can use Page.IsPostback attribute to fill controls with user's data. On postbacks ViewState mechanism should preserve controls' contents.

There are also some other mechanisms that allow you to pass data between pages, like Session state. This can be used if you need user details on more pages than just those two. This way you don't have to access the database to often.

Using Server.Transer() method to redirect user to another page and using PreviousPage object can give you access to other page as well, but I suppose using QueryString and reading data directly on Home page would be the most appropriate in your case.

Links that can be helpful:

Upvotes: 3

Sloth
Sloth

Reputation: 172

Instances don't stay alive when you browse through pages on the web, you can store things you need in a session and get it when the new page loads you can do this when you need to store the data

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

and you can do this when you need the data again

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

Upvotes: 1

Related Questions