如果注册网络表单中已存在用户名,则以正确的方式显示错误消息 (asp.net)
Display error message in a correct way if username already exists in a registration webform (asp.net)
我可以使用如下代码检查用户名是否已存在:
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
try
{
conn.Open();
String checkUsr_query = "SELECT count(*) from Job_UserData where username = @Usn";
SqlCommand comm = new SqlCommand(checkUsr_query, conn);
comm.Parameters.AddWithValue("@Usn", TextBox_Usn.Text);
if (!comm.ExecuteScalar().ToString().Equals("0"))
{
Label_Usn.Visible = true;
}
else
{
Label_Usn.Visible = false;
}
}
catch (Exception check_usr)
{
Response.Write(check_usr.ToString());
}
finally
{
if (conn != null)
conn.Close();
}
}
其他变体不使用单独的标签,而是更改 RequiredFieldValidator
中的文本,或者我可以将其与 CustomValidator
一起使用并更改其可见性。
我想做的是在按下提交按钮时检查文本框是否为空,这由RequiredFieldValidator
负责,一旦我离开用户名文本框,它就会检查并显示用户名是否可用以及 提交 单击不应允许用户注册。
目前我正在使用这个代码:
protected void Button_RegForm_Submit_Click(object sender, EventArgs e)
{
/* if (Label_Usn.Visible)
{
return;
}
* */
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
try
{
String insert_query = "INSERT into Job_UserData VALUES (@Usn,@Pass,@Village,@Contact,@Address,@Occupation)";
conn.Open();
SqlCommand comm = new SqlCommand(insert_query, conn);
comm.Parameters.AddWithValue("@Usn", TextBox_Usn.Text);
comm.Parameters.AddWithValue("@Pass", TextBox_Pass.Text);
comm.Parameters.AddWithValue("@Village", TextBox_Village.Text);
comm.Parameters.AddWithValue("@Contact", TextBox_Contact.Text);
comm.Parameters.AddWithValue("@Address", TextBox_Address.Text);
comm.Parameters.AddWithValue("@Occupation", TextBox_Occupation.Text);
comm.ExecuteNonQuery();
}
catch (Exception insertError)
{
Response.Write(insertError.ToString());
}
finally
{
if (conn != null)
conn.Close();
}
}
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
try
{
conn.Open();
String checkUsr_query = "SELECT count(*) from Job_UserData where username = @Usn";
SqlCommand comm = new SqlCommand(checkUsr_query, conn);
comm.Parameters.AddWithValue("@Usn", TextBox_Usn.Text);
if (!comm.ExecuteScalar().ToString().Equals("0"))
{
args.IsValid = false;
}
else
{
args.IsValid = true;
}
}
catch (Exception check_usr)
{
Response.Write(check_usr.ToString());
}
finally
{
if (conn != null)
conn.Close();
}
}
而且我必须对用户名文本框使用 AutoPostBack
以确保在我离开用户名文本框后立即检查重复的用户名。我发布的代码在没有 AutoPostBack
的情况下工作,但即使在显示该用户名不可用后它也允许用户注册,并且它不会在不单击 提交 按钮的情况下检查重复的用户名。
当我使用 AutoPostBack
属性 时,RequiredFieldValidator
属性 出现问题,就好像该字段为空一样,由于 PostBack
,页面会刷新在我离开用户名文本框并且 "Username is required" 消息闪烁一秒钟然后消失,这是我不想要的。
我尝试将用户名检查部分放在 Page_Load
方法中,并为 RequiredFieldValidator
使用文本更改 属性,但有时它会显示错误消息。
我怎样才能做到这一点,还是使用 Page_load
方法完成但我做错了?有更好的方法吗?
我希望此表格的工作方式是我认为其他在线表格的工作方式,如果它们的工作方式不同,请分享该方法。
您的文本框控件:
<asp:TextBox ID="txtUserName" runat="server" AutoPostBack="true" OnTextChanged="txtUserName_TextChanged" />
你的txtUserName_TextChanged方法:
protected void txtUserName_TextChanged(object sender, EventArgs e){
string constr = WebConfigurationManager.ConnectionStrings["your_con_string_name"].ConnectionString;
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand("select id from Job_UserData where lower(username) = lower(@Usn)", con);
//your code will not work, if you have in database UserName = "login", but user write it as "Login", because your sql-query is case sensitive
cmd.Parameters.AddWithValue("@Usn", txtUserName.Text);
bool is_exists = false;
try{
con.Open();
is_exists = cmd.ExecuteScalar() == null ? false : true;
}
catch(Exception ex){
//if you will work with exceptions. But they will not be =)
}
finally{
con.Close();
}
if (is_exists)
{
someLabelBelowTheTextBox.Text = "This UserName is already exists. Please Choose another one";
txtUserName.Focus();
}
}
希望对你的情况有所帮助。
这是另一个例子:
protected void btnSignUp_Click(object sender, EventArgs e)
{
if (!CheckLogin(txtLogin.Text.ToString().Trim()))
{
//Register the user
}
else
{
lblLoginAvailable.Visible = true;
lblLoginAvailable.Text = "This login already exists in our system. Chooce another login please";
}
}
protected bool CheckLogin(string login)
{
SqlConnection con = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("select id from users where lower(login) = lower(@login)", con);
cmd.Parameters.Add("@login", SqlDbType.VarChar).Value = login;
string id = "";
try
{
con.Open();
id = cmd.ExecuteScalar() == null ? "" : cmd.ExecuteScalar().ToString();
}
catch (Exception ex)
{
//...
}
finally
{
con.Close();
}
if (String.IsNullOrEmpty(id)) return false;
return true;
}
我在我的项目中使用了它,它 100% 有效。希望这段代码能让你理解清楚并对你有所帮助。
这是我的看法:
.aspx
<asp:TextBox ID="txtUsername" runat="server" required />
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" required />
<asp:CustomValidator ID="cvUsername" runat="server" ControlToValidate="txtUsername"
SetFocusOnError="true" ErrorMessage="Username already existing!" Display="Dynamic"
OnServerValidate="cvUsername_ServerValidate" />
<asp:Button ID="btnSignUp" runat="server" Text="Sign Up" OnClick="btnSignUp_Click" />
为了减少添加 RequiredFieldValidator 控件的麻烦,您可以改用 HTML 必需属性。
.aspx.cs
protected void cvUsername_ServerValidate(object source, ServerValidateEventArgs args)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT ID FROM Job_UserData WHERE Username=@Username";
cmd.Parameters.AddWithValue("@Username", txtUsername.Text);
SqlDataReader data = cmd.ExecuteReader();
if (data.HasRows) // Username is existing
args.IsValid = true; // will display error message
else
args.IsValid = false;
con.Close();
con.Dispose();
}
我可以使用如下代码检查用户名是否已存在:
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
try
{
conn.Open();
String checkUsr_query = "SELECT count(*) from Job_UserData where username = @Usn";
SqlCommand comm = new SqlCommand(checkUsr_query, conn);
comm.Parameters.AddWithValue("@Usn", TextBox_Usn.Text);
if (!comm.ExecuteScalar().ToString().Equals("0"))
{
Label_Usn.Visible = true;
}
else
{
Label_Usn.Visible = false;
}
}
catch (Exception check_usr)
{
Response.Write(check_usr.ToString());
}
finally
{
if (conn != null)
conn.Close();
}
}
其他变体不使用单独的标签,而是更改 RequiredFieldValidator
中的文本,或者我可以将其与 CustomValidator
一起使用并更改其可见性。
我想做的是在按下提交按钮时检查文本框是否为空,这由RequiredFieldValidator
负责,一旦我离开用户名文本框,它就会检查并显示用户名是否可用以及 提交 单击不应允许用户注册。
目前我正在使用这个代码:
protected void Button_RegForm_Submit_Click(object sender, EventArgs e)
{
/* if (Label_Usn.Visible)
{
return;
}
* */
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
try
{
String insert_query = "INSERT into Job_UserData VALUES (@Usn,@Pass,@Village,@Contact,@Address,@Occupation)";
conn.Open();
SqlCommand comm = new SqlCommand(insert_query, conn);
comm.Parameters.AddWithValue("@Usn", TextBox_Usn.Text);
comm.Parameters.AddWithValue("@Pass", TextBox_Pass.Text);
comm.Parameters.AddWithValue("@Village", TextBox_Village.Text);
comm.Parameters.AddWithValue("@Contact", TextBox_Contact.Text);
comm.Parameters.AddWithValue("@Address", TextBox_Address.Text);
comm.Parameters.AddWithValue("@Occupation", TextBox_Occupation.Text);
comm.ExecuteNonQuery();
}
catch (Exception insertError)
{
Response.Write(insertError.ToString());
}
finally
{
if (conn != null)
conn.Close();
}
}
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
try
{
conn.Open();
String checkUsr_query = "SELECT count(*) from Job_UserData where username = @Usn";
SqlCommand comm = new SqlCommand(checkUsr_query, conn);
comm.Parameters.AddWithValue("@Usn", TextBox_Usn.Text);
if (!comm.ExecuteScalar().ToString().Equals("0"))
{
args.IsValid = false;
}
else
{
args.IsValid = true;
}
}
catch (Exception check_usr)
{
Response.Write(check_usr.ToString());
}
finally
{
if (conn != null)
conn.Close();
}
}
而且我必须对用户名文本框使用 AutoPostBack
以确保在我离开用户名文本框后立即检查重复的用户名。我发布的代码在没有 AutoPostBack
的情况下工作,但即使在显示该用户名不可用后它也允许用户注册,并且它不会在不单击 提交 按钮的情况下检查重复的用户名。
当我使用 AutoPostBack
属性 时,RequiredFieldValidator
属性 出现问题,就好像该字段为空一样,由于 PostBack
,页面会刷新在我离开用户名文本框并且 "Username is required" 消息闪烁一秒钟然后消失,这是我不想要的。
我尝试将用户名检查部分放在 Page_Load
方法中,并为 RequiredFieldValidator
使用文本更改 属性,但有时它会显示错误消息。
我怎样才能做到这一点,还是使用 Page_load
方法完成但我做错了?有更好的方法吗?
我希望此表格的工作方式是我认为其他在线表格的工作方式,如果它们的工作方式不同,请分享该方法。
您的文本框控件:
<asp:TextBox ID="txtUserName" runat="server" AutoPostBack="true" OnTextChanged="txtUserName_TextChanged" />
你的txtUserName_TextChanged方法:
protected void txtUserName_TextChanged(object sender, EventArgs e){
string constr = WebConfigurationManager.ConnectionStrings["your_con_string_name"].ConnectionString;
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand("select id from Job_UserData where lower(username) = lower(@Usn)", con);
//your code will not work, if you have in database UserName = "login", but user write it as "Login", because your sql-query is case sensitive
cmd.Parameters.AddWithValue("@Usn", txtUserName.Text);
bool is_exists = false;
try{
con.Open();
is_exists = cmd.ExecuteScalar() == null ? false : true;
}
catch(Exception ex){
//if you will work with exceptions. But they will not be =)
}
finally{
con.Close();
}
if (is_exists)
{
someLabelBelowTheTextBox.Text = "This UserName is already exists. Please Choose another one";
txtUserName.Focus();
}
}
希望对你的情况有所帮助。
这是另一个例子:
protected void btnSignUp_Click(object sender, EventArgs e)
{
if (!CheckLogin(txtLogin.Text.ToString().Trim()))
{
//Register the user
}
else
{
lblLoginAvailable.Visible = true;
lblLoginAvailable.Text = "This login already exists in our system. Chooce another login please";
}
}
protected bool CheckLogin(string login)
{
SqlConnection con = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("select id from users where lower(login) = lower(@login)", con);
cmd.Parameters.Add("@login", SqlDbType.VarChar).Value = login;
string id = "";
try
{
con.Open();
id = cmd.ExecuteScalar() == null ? "" : cmd.ExecuteScalar().ToString();
}
catch (Exception ex)
{
//...
}
finally
{
con.Close();
}
if (String.IsNullOrEmpty(id)) return false;
return true;
}
我在我的项目中使用了它,它 100% 有效。希望这段代码能让你理解清楚并对你有所帮助。
这是我的看法:
.aspx
<asp:TextBox ID="txtUsername" runat="server" required />
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" required />
<asp:CustomValidator ID="cvUsername" runat="server" ControlToValidate="txtUsername"
SetFocusOnError="true" ErrorMessage="Username already existing!" Display="Dynamic"
OnServerValidate="cvUsername_ServerValidate" />
<asp:Button ID="btnSignUp" runat="server" Text="Sign Up" OnClick="btnSignUp_Click" />
为了减少添加 RequiredFieldValidator 控件的麻烦,您可以改用 HTML 必需属性。
.aspx.cs
protected void cvUsername_ServerValidate(object source, ServerValidateEventArgs args)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Job_Registration_ConnectionString"].ConnectionString);
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT ID FROM Job_UserData WHERE Username=@Username";
cmd.Parameters.AddWithValue("@Username", txtUsername.Text);
SqlDataReader data = cmd.ExecuteReader();
if (data.HasRows) // Username is existing
args.IsValid = true; // will display error message
else
args.IsValid = false;
con.Close();
con.Dispose();
}