如果用户名已存在于注册Web表单(asp.net)中,则以正确的方式显示错误消息
本文关键字:消息 显示 方式 错误 asp 存在 用户 于注册 如果 表单 Web | 更新日期: 2023-09-27 18:26:42
我可以使用以下代码检查用户名是否已经存在:
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
的情况下可以工作,但它允许用户在显示用户名不可用后进行注册,并且在不单击Submit按钮的情况下不会检查重复的用户名。
当我使用AutoPostBack
属性时,它会对RequiredFieldValidator
属性产生问题,就好像字段为空一样。在我离开用户名文本框后,由于PostBack
,页面会刷新,"username is required"消息会闪烁一秒钟,然后消失,这是我不想要的。我尝试将用户名检查部分放在Page_Load
方法中,并为RequiredFieldValidator
使用文本更改属性,但有时它会显示错误的消息。
我如何才能做到这一点,或者是使用Page_load
方法完成的,但我做错了?有更好的方法吗
我希望这个表格的工作方式是我相信其他在线表格的工作方法,如果它们的工作方式不同,请分享这种方法。
这里是另一个例子:
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%有效。希望这段代码能让你明白,并对你有所帮助。
您的文本框控件:
<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();
}
}
希望对你有帮助。
这是我的看法:
.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 required属性。
.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();
}