如果注册网络表单中已存在用户名,则以正确的方式显示错误消息 (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();
}