admin/usersとしてログインしようとすると「オブジェクトのインスタンスがオブジェクトのインスタンスに設定されていません。ユーザが正常にページにログインすると、以下のaspx.cs.コードとリンクされる別のクラスファイルの名前connectionclass.csは、ナビゲーションバーの「ようこそ、(ユーザー名)」を示すために使用されます。ユーザーがログインしようとしたときにオブジェクト参照がオブジェクトのインスタンスに設定されていない
//Store login variables in session
Session["login"] = users.Username;
Session["type"] = users.User_Type;
When i try to login, it shows this error:
ASPX:
<div style="text-align:center">
Username:
<asp:TextBox ID="txtLogin" runat="server" CssClass="inputs"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ErrorMessage="*Username is required" ForeColor="Red" ControlToValidate="txtLogin"></asp:RequiredFieldValidator>
<div>Password:
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" CssClass="inputs"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ErrorMessage="*Password is required" ForeColor="Red" ControlToValidate="txtPassword"></asp:RequiredFieldValidator>
<br />
<asp:Label ID="lblError" runat="server" Text=""></asp:Label>
<asp:Button ID="btnLogin" runat="server" Text="Log In" OnClick="btnLogin_Click" CssClass="button" /><br />
</div>
ASPX.CS:
protected void btnLogin_Click(object sender, EventArgs e)
{
Users users = ConnectionClass.LoginUser(txtLogin.Text, txtPassword.Text);
SqlConnection con = new SqlConnection(@"Data Source=NOONS\SQLEXPRESS;Initial Catalog=StudentFeedbackSystemDB;Integrated Security=True");
string cmdStr = "select user_type from users where username='" + txtLogin.Text + "' AND password = '" + txtPassword.Text + "'";
SqlCommand cmd = new SqlCommand(cmdStr, con);
con.Open();
Object user_type = cmd.ExecuteScalar();
con.Close();
if (user_type != null)
{
lblError.Visible = false;
lblError.Text = "";
if (user_type.ToString() == "administrator")
{
//Store login variables in session
Session["login"] = users.Username;
Session["type"] = users.User_Type;
Response.Redirect("~/Pages/Admin/AdminHome.aspx");
}
else if (user_type.ToString() == "users")
{
//Store login variables in session
Session["login"] = users.Username;
Session["type"] = users.User_Type;
Response.Redirect("~/StudentHome.aspx");
}
}
else
{
lblError.Visible = true;
lblError.Text = "*Invalid Username and Password";
lblError.ForeColor = System.Drawing.Color.Red;
}
}
}
ConnectionClass.cs
public static Users LoginUser(string username, string password)
{
//check if user exists
string query = string.Format("SELECT COUNT(*) FROM StudentFeedbackSystemDB.dbo.Users WHERE username = '{0}'", username);
command.CommandText = query;
try
{
conn.Open();
int amountOfUsers = (int)command.ExecuteScalar();
if(amountOfUsers == 1)
{
//if users exist, check if the password match
query = string.Format("SELECT password FROM Users WHERE username = '{0}'", username);
command.CommandText = query;
string dbPassword = command.ExecuteScalar().ToString();
if(dbPassword == password)
{
//if password are match, retrieve user data from the database
query = string.Format("SELECT user_type FROM [Users] WHERE username ='{0}'", username);
command.CommandText = query;
SqlDataReader reader = command.ExecuteReader();
Users users = null;
while (reader.Read())
{
string user_type = reader.GetString(0);
users = new Users(username, password, user_type);
}
return users;
}
else
{
//if password dont match
return null;
}
}
else
{
//if user exist
return null;
}
}
finally
{
conn.Close();
}
}
あなたのコードでは、セマンティクスとして 'null'を使わないでください。あなたのシステムの中で 'null 'を渡すことは、遅かれ早かれNullReferenceExeptionを避けられません。代わりに、ログイン試行をモデル化するクラスを作成します。おそらく、ログイン試行が成功したかどうかを示すboolプロパティがあります。ログインが失敗した理由を示す列挙型。このクラスを返すのではなく、 'Users'または' null'を返します。 –