2012-04-21 10 views
0

私はこのことに気をつけて、実際には壁にぶつかります。 私はログインページにユーザー名とパスワードを入力し、関数はすべてのユーザーの詳細を取得するために呼び出されます。つまり、ファーストネームの姓電子メールアカウントタイプExamtakenなどです。プロパティは私がホームページでそれらを使用することができますが、私には知られていないいくつかの愚かな理由のために働いていない!あなたはしばらくの上から(da.read)を見ることができるように、ユーザーがクリックする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; 
     } 
    } 
} 

にログインしたときに呼び出されるメソッドが表示されます以下のハッシュテーブルの値とのget setメソッドを割り当てるイムdebugginとき私は値が入るのを見ることができます!この値はnullまたは空ではありません。

コードはログインページに戻ってきます。すべてがうまくいれば、ユーザーが試験に行くことができるホームページへのresponse.redirectですが、そのページではhome.aspxの読み込み私は、私はExamMethodsクラスではなく、そのヌルを得るためにプロパティを参照するように私は、ユーザー名をpopualteにしたいラベルがありますか?どのようにこれは可能ですか?私は何が欠けていますか?私が手のsetメソッドは何もしていないことをホームページにログインページからreponse.redirectを使用していたので、 これは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; 

     } 

するためのコードでは、それか?または私は愚かな以上何かを見ても私には、この上に任意の助けをいただければ幸いです。 ありがとうございます。

+0

がデータを必要とするとき、あなたはこれを行うことができますが、実際には 'CheckLogin'を呼び出しているところ私が足りませんか?あなたが求めているメソッドを呼び出していないときに何がうまくいかないと言うのは難しいです。 –

答えて

7

Webページを使用しているときに、変数はWebページ間で共有されません。ご存じのように、HTTPはステートレスなプロトコルです。

どうすればいいですか?

あなたは状態管理が必要です。情報を渡す方法が必要です。私が見るところでは、Sessionsは、このデータを複数のページで使用するのに最適な場所のようです。

しかし、あなたが持っている唯一の状態管理オプションではありません。あなたは、あなたが保存したいもの、保存したいもの、そしてどこにアクセスしたいかに応じて、さらに多くを持っています。

ASP .NET State Managementもまた読んで、recommendationsを読んで、どのシナリオでどの状態管理機能を使用するのかを理解することをお勧めします。

+0

私は、あるページから別のページに行くときにこれが当てはまると思っていたのですが、そのリンクの情報を参考にしてみてください。 –

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属性を使用することができmonetioning価値があります。ポストバックでは、ViewStateメカニズムはコントロールの内容を保存する必要があります。

あなたはセッション状態のように、ページ間でデータを渡すことができ、いくつかの他のメカニズムもあります。これは、2つ以上のページにユーザーの詳細が必要な場合に使用できます。この方法では、頻繁にデータベースにアクセスする必要はありません。

別のページにユーザーをリダイレクトするためにServer.Transer()メソッドを使用して、あなたは同様に他のページへのアクセス権を与えることができPreviousPageオブジェクトを使用して、私はQueryStringを使用し、あなたのケースで最も適切であろうホームページ上で直接データを読み込むとします。参考にすることができ

リンク:

1

あなたがウェブ上のページを閲覧するとき、インスタンスが生きて滞在していません、あなたは物事を格納することができます新しいページがロードされたときにセッションに必要なデータを取得する データを保存する必要があるときにこれを行うことができます

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

、あなたは再び

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

私は可能な限りサーバーを呼び出さないようにしようとしています。私の考えではパフォーマンスは良くなりますが、あなたが提供しているスニペットに興味があります。しかし、1つの質問があります。私はホームページに送信されると、そのページのセッション変数に詳細を追加するinformaitonを取得するためにサーバーへの呼び出しを行っただけです。どのように私はメソッドページにあるセッション変数を参照するのですか? –

+0

私はあなたが本当に意味するものは分かりません。あなたはセッションからデータを取得し、それを操作したり、データを追加したり、準備ができたら操作された変数をセッションにもう一度追加したりできます – Sloth