0

私はこれで立ち往生していて、本当に数分で頭を壁にぶつけるつもりです。ユーザーがそこにユーザー名とパスワードを入力し、ログインをクリックすると、すべてのユーザーの詳細を取得する関数が呼び出されます。 firstname surname Email AccountType Examtaken 関数内で「Get; Set;」を設定しようとしています。プロパティなので、ホームページで使用できますが、私には知られていない愚かな理由で機能していません! 以下に、ユーザーがログインをクリックしたときに呼び出されるメソッドを示します。

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) im で値をハッシュテーブルに割り当て、debuggin のときに get set メソッドで値が入っていることがわかります。そして、私は100%、この値はnullまたは空ではありません

次に、コードはログイン ページに戻り、すべてが問題なければ、response.redirect をユーザーが試験を受けることができるホームページにリダイレクトしますが、home.aspx のページ ロードには、必要なラベルがあります。ユーザー名を入力して、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;

       }

get set メソッドが何もないのは、ログイン ページからホームページへの reponse.redirect を使用したためですか?

4

3 に答える 3

7

Web ページで作業している場合、変数は Web ページ間で共有されません。ご存じのとおり、HTTP はステートレス プロトコルです。

では、これを行うにはどうすればよいですか?

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

ただし、状態管理オプションはセッションだけではありません。保存したいもの、保存したい量、いつどこにアクセスしたいかによって、さらに多くのものがあります。

どのシナリオでどの状態管理機能を使用するかを理解するために、ASP .NET 状態管理についても推奨事項についてもお読みになることをお勧めします。

于 2012-04-21T17:43:58.243 に答える
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メカニズムでは、コントロールのコンテンツを保持する必要があります。

Session stateのように、ページ間でデータを渡すことができるメカニズムは他にもいくつかあります。これは、これら 2 つのページだけでなく、より多くのページでユーザーの詳細が必要な場合に使用できます。これにより、データベースに頻繁にアクセスする必要がなくなります。

メソッドを使用Server.Transer()してユーザーを別のページにリダイレクトし、PreviousPageオブジェクトを使用すると、他のページにもアクセスできますが、ホームページQueryStringで直接データを使用して読み取るのが最も適切だと思います。

役立つリンク:

于 2012-04-21T17:47:13.043 に答える
1

Web 上のページをブラウズするとき、インスタンスは存続しません。必要なものをセッションに保存し、新しいページがロードされたときにそれを取得できます。データを保存する必要があるときにこれを行うことができます。

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

データが再び必要になったときにこれを行うことができます

var data = Session["data"] as Data;
if(data != null)
//do something with the data
于 2012-04-21T17:56:10.190 に答える