2017-11-19 18 views
0

ログインしようとすると、私は自分のユーザー名をキャプチャしてマスターページに貼り付けることができません。エラー:タイプ 'System.String'のオブジェクトを 'Member'と入力できませんでした。 'なぜそうですか?私はラベルのマスターページにユーザー名を印刷できるようにしたい。しかし、私は次のように遭遇します。 'System.String'タイプのオブジェクトを 'Member'と入力することができません。 'ログイン後にマスターページにユーザー名のテキストを印刷できません。エラー:タイプのオブジェクトをキャストできません

は、これはこれは私のLoginForm.aspx.cs

protected void btnLogin_Click(object sender, EventArgs e) 
    { 
     /* Allows login to be stored to session*/ 
     SqlConnection con = new SqlConnection(conStr); 

     SqlCommand command = new SqlCommand(); 
     command.Connection = con; 
     command.CommandText = "select * from Participant where [email protected]_username and [email protected]_password"; 
     command.Parameters.AddWithValue("@participant_username", tbxUserName.Text); 
     command.Parameters.AddWithValue("@participant_password", tbxPassword.Text); 

     con.Open(); 
     SqlDataReader rd = command.ExecuteReader(); 
     if (rd.HasRows) 
     { 
      rd.Read(); 
      Session["user"] = tbxUserName.Text; 
      Response.Redirect("default.aspx"); 
     } 
     else 
     { 
      lblOutput.Text = "Invalid username or password."; 

     } 
    } 

私はメンバーキャストの除去を理解し、自分のコードの原因のしかし、別の部分である私のHomePage.Master.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class HomePage : System.Web.UI.MasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["user"] != null) 
     { 
      lblUser.Text = ((Member)Session["user"]).Username; 
      lbtnLogin.Text = "Logout"; 
     } 
     else 
     { 
      lblUser.Text = ""; 
      lbtnLogin.Text = "Login"; 
     } 
    } 

ですエラー:

if (Session["cart"] == null) 
    { 
     ShoppingCart s = new ShoppingCart(); 
     s.Member = (Member)Session["user"]; 

     Session["cart"] = s; 
    } 
    ShoppingCart sc = (ShoppingCart)Session["cart"]; 
    sc.Seminar = a; 
    sc.schid = b; 
    sc.Seminar.Speaker = c; 


    Response.Redirect("ShoppingCartForm.aspx"); 

このコードの一部は、ショッピングカートのセッションが空の場合は、メンバーと一緒に新しいショッピングカートを初期化します。 s.Member =(Member)セッション["user"];エラーを投げた。

+0

どうして 'UserName'を' Member'にキャストしているのですか?既に文字列であり、文字列として使用したい場合、 'Member'にキャストするとエラーメッセージが表示されます。だから本当に、なぜ主張するのですか? – oerkelens

答えて

0

変更:

lblUser.Text = ((Member)Session["user"]).Username; 

へ:

lblUser.Text = (string)Session["user"]; 

ボタンを押すにあなたがtbxUserName.Textから文字列値にセッション値を設定しているので、これは次のとおりです。

Session["user"] = tbxUserName.Text; 
+0

私はそれをやってみましたが、私の別のページには次のようなものがあります:タイプ 'System.String'のオブジェクトを 'Member'と打ち込むことができません。このページは私のリストセミナーページです。 if(セッション["cart"] == null) { ShoppingCart s = new ShoppingCart(); s。メンバー=(Member)セッション["user"]; セッション["cart"] = s; } –

+0

あなたは 'Session [" user "]'に格納している値を混ぜ合わせているように見えますが、あなたのすべてのページで使用されている値を格納するか、別のキーに格納します - 'Session [" username "]'/'Session [" memeber "]' –

+0

ありがとうございました。質問をもっと明確に更新しました。 –

0

これは間違ったキャストを使用する理由です。

Sessionはオブジェクトのコレクションを保持します。このコレクションのオブジェクトのタイプはSystem.Objectです。これは.NET内のすべてのオブジェクトの基本型です。 Sessionに任意のオブジェクトタイプを保存することができます。実際にはオブジェクトへの参照を格納していますし、名前(数字のように)や数字インデックス(Session[0]Session[1]など)でもretieveできます。ただし、オブジェクトのプロパティは参照がSessionに格納されています。最初にキャストを行い、次にこのプロパティにアクセスしようとします。あなたのケースでは、私は次の行から推測できるとおり

Session["user"] = tbxUserName.Text; 

あなたはSessionに格納userオブジェクトの型がstringです。したがって、以下のキャストを作成することによって:

lblUser.Text = (string)Session["user"]; 

あなたはそれを取得します。

関連する問題