2015-12-13 189 views
0

我能够检查用户名已经存在使用这样的代码:显示错误消息(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后,我离开的用户名文本框和第二的“需要用户名”消息闪烁,然后消失我不想要。 我试着将Page_Load方法中的用户名检查部分和RequiredFieldValidator使用的文本更改属性,但有时会显示错误的信息。

我该如何做到这一点,或者是否使用Page_load方法完成,但我做错了吗?有没有更好的方法来做到这一点?
我希望这种形式的工作方式是我相信其他在线形式的工作,如果他们以不同的方式工作,请分享该方法。

+0

作为一个方面的问题,你真的将查询发送到服务器的客户端验证时,每一次?我会检查用户名是否仅在提交时存在。 –

+0

我认为通常这些表格告诉你,只要你输入它并更改文本框 –

+0

@abhishekjaiswal,就可以使用用户名,因为他需要启用cookie。,我是对的吗? – goofyui

回答

0

下面是另一个例子:

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%。希望这段代码能让你的理解变得清晰,并且会帮助你。

+0

将“用户已经退出”标签的可见性设置为true之后,即使数据库中尚未存在输入的下一个用户名,消息仍将保留在那里,我可以对此做些什么吗?我知道我可能必须将其可见性设置为假再次,但我不知道在哪一点 –

+0

@abhishekjaiswal改变此方法为: 保护无效btnSignUp_Click(对象发件人,EventArgs e) { lblLoginAvailable.Visible = false;每次//,当用户点击按钮,它会先聘请你的控制,然后做下一步 如果(!CheckLogin(txtLogin.Text.ToString()。修剪())){ // 注册用户 } else { lblLoginAvailable.Visible = true; lblLoginAvailable.Text =“此登录已存在于我们的系统中,请其他用户登录”; }} – Khazratbek

+0

一切正常,除了一个,当我在一个用户名输入改变文本框,然后回来的用户名文本框,并删除该用户名和更改文本框再次,“用户名是必需的”闪烁,然后进入away.I知道其相关autopostpack和requiredfieldvalidator,但它是非常烦人的,有没有解决这个问题的方法,以便这个平台不显示或者它停留在那里? –

0

您的TextBox控件:

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

希望它可以帮助你在你的情况。

+0

什么是分众做的,它仍然会记录用户名是否已经存在,并且我按除非我错过了一些东西在这里 –

+0

@abhishekjaiswal焦点会自动将光标移动到您的控制提交按钮,它会采取控制。我敢肯定,这段代码的作品,绝对是我。但可能在你的情况TextChanged方法不符合预期。因此,尝试将TextChanged内的代码移到Button_Click方法来检查。我会用一个例子为你提供一个答案。 – Khazratbek

0

这是我的看法:

的.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 [email protected]"; 
    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(); 
}