如果用户名已存在于注册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方法完成的,但我做错了?有更好的方法吗
我希望这个表格的工作方式是我相信其他在线表格的工作方法,如果它们的工作方式不同,请分享这种方法。

如果用户名已存在于注册Web表单(asp.net)中,则以正确的方式显示错误消息

这里是另一个例子:

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();
}