2012-04-21 3 views
0

인스턴트 메신저와 메신저 정말 벽에 내 머리에 분발에 간다 나는 사용자가 거기에 입력하는 로깅 페이지가 사용자 이름과 비밀 번호를 클릭하고 그들이 이것을 누르면 로그인을 클릭하십시오 함수는 모든 사용자 세부 정보를 얻으려면 호출됩니다. 예를 들어 firstname surname 전자 메일 계정 유형 Examtaken 등은 "Get; Set;"을 설정하려고합니다. 속성 그래서 내가 그들을 홈 페이지에서 사용할 수 있지만 내게 알려지지 않은 몇 가지 바보 같은 이유로 그 작동하지! 사용자가 클릭이문제 설정과 함께 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; 
     } 
    } 
} 

로그인 할 때 debuggin 때 해시 테이블 및 가져 오기 설정 방법에 값을 할당 그동안 (da.read) 메신저에 위에서 볼 수 있듯이 당신은 호출되는 방법을 볼 수 아래로 나는 값을 볼 수 있습니다! 그리고 100 %이 값은 널이거나 공란이 아닙니다.

코드가 모두 로그인 페이지로 되돌아갑니다. 그러면 모두 괜찮 으면 사용자가 시험을 볼 수있는 홈 페이지로 응답하지만, 페이지에서는 응답합니다. home.aspx의로드 나는 사용자 이름과 함께 popualte하기를 원하는 레이블을 가지고 있으므로 ExamMethods 클래스의 null 속성을 참조한다. 어떻게 가능할까요? 내가 뭘 놓치고 있니? 이 내가이 (가) 설정 방법은 아무것도 얻을 홈 페이지로 로그인 페이지에서 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; 

     } 

의 코드는 그것을이다? 또는 나는 어리 석고 넘어서 무언가를 보았다 또한 새로운 C#에 이렇게 나에 게 베어드십시오, 이것에 어떤 도움든지 높게 평가 될 것입니다. 감사합니다.

+0

암의 데이터를 필요로 할 때 당신이 할 수 있습니까? 당신이 요구하는 방법을 부르지 않을 때 어떤 일이 잘못 될지 말하기는 어렵습니다. –

답변

7

웹 페이지로 작업 할 때 변수가 웹 페이지간에 공유되지 않습니다. 아시다시피 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 메커니즘은 컨트롤의 내용을 유지해야합니다.

세션 상태 같은 당신은 페이지 사이에 데이터를 전달할 수 있도록 다른 메커니즘이 있습니다. 이 두 페이지 이외의 페이지에 사용자 세부 정보가 필요한 경우 사용할 수 있습니다. 이렇게하면 자주 데이터베이스에 액세스 할 필요가 없습니다.

다른 페이지로 사용자를 리디렉션하는 Server.Transer() 방법을 사용하고 당신은뿐만 아니라 다른 페이지에 액세스 할 수 있습니다 PreviousPage 객체를 사용하여,하지만 난 QueryString를 사용하여 귀하의 경우 가장 적절한 것 페이지에서 직접 데이터를 읽고 가정하자. 도움이 될 수

링크 :

1

당신이 웹 페이지를 탐색 할 때 인스턴스는 당신이 일을 저장할 수있는, 살아 남기하지 않습니다 당신은 세션에서 필요하고 새로운 페이지가로드 될 때 얻으십시오 데이터를 저장할 필요가있을 때 이것을 할 수 있습니다

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

하고 다시 당신이 실제로`CheckLogin`를 호출하고 어디 누락

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

Im은 서버를 가능한 한 많이 호출하지 않으려 고 노력했습니다. perfomance가 더 좋을 것입니다. 내가 제공 한 스 니펫에 관심이 있습니다.하지만 한 가지 질문이 있습니다. 어떻게 글로벌 세션으로 선언 할 수 있습니까? 그래서 예를 들어, 그냥 예를 들어, 그냥 정보를 얻기 위해 서버에 전화를 했어 내가 그 페이지의 세션 변수에 세부 사항을 추가 할 때 홈 페이지로 보내지는 어떻게 참조 할 수있는 세션 varible 방법 페이지에있는 참조? –

+0

당신이 정말로 무슨 뜻인지 모르겠다. Session에서 데이터를 가져 와서 조작 할 수 있고, 데이터를 추가 할 수있다. 준비가되면 조작 된 변수를 Session에 다시 추가 할 수있다. – Sloth

관련 문제