2015-12-13 188 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(); 
}