检查Custom Validator是否存在用户名

时间:2014-06-04 21:05:04

标签: c# asp.net

我有这个自定义验证器

 <asp:CustomValidator ID="CustomValidator1" runat="server" 
  ErrorMessage="Username already exists!" ForeColor="Red" 
  onservervalidate="checkUsername" ControlToValidate="TextBoxUsername" 
  meta:resourcekey="CustomValidator1Resource1">
 </asp:CustomValidator>

和此代码背后的

public void checkUsername(object source, ServerValidateEventArgs args)
    {
        string connString = "Data Source=icsd-db.aegean.gr\\icsdmssqlsrv;Initial Catalog=icsd12015;Integrated Security=True;";
        string cmdText = "SELECT COUNT(*) FROM Users WHERE username LIKE '%' + @username + '%'";

        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();

            using (SqlCommand cmd = new SqlCommand(cmdText, conn))
            {
                cmd.Parameters.AddWithValue("@username", TextBoxUsername.Text);

                int count = (int)cmd.ExecuteScalar();

                if (count > 0)
                {
                    args.IsValid = false; 
                }
            }
        }
    }

但它似乎没有用......任何想法?

(我甚至尝试设置命令..LIKE'%user%'..其中user是现有用户名 但它一直让我添加它,错误永远不会爆发)

按钮的代码

protected void Button3_Click(object sender, EventArgs e)
    {

        string HashPassword; 
        HashPassword=sha256(TextBoxPassword.Text);
        string connectionString = "Data Source=icsd-db.aegean.gr\\icsdmssqlsrv;Initial Catalog=icsd12015;Integrated Security=True;";
        System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connectionString);
        conn.Open();
        string queryString = "INSERT INTO [Users] (username,password,name,surname,birthdate) VALUES ('" + TextBoxUsername.Text + "','" + HashPassword + "','"+ TextBoxName.Text +"','"+ TextBoxSurname.Text +"','"+ DropDownYear.Text +"/"+ DropDownMonth.Text +"/"+ DropDownDay.Text +"');";


        System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(queryString, conn);


        try
        {

            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {

            throw new Exception(ex.ToString(), ex);

        }
        conn.Close();

        Response.Redirect("EpitixiaNewAccount.aspx", true);


        }
    }

3 个答案:

答案 0 :(得分:2)

考虑到您在问题中发布的代码,您似乎只实现了服务器端验证。

请注意,服务器端验证不会阻止代码执行,但如果验证失败,它只会将Page.IsValid标志设置为false。因此,添加用户的代码将始终运行。为了考虑验证的结果,您应该在尝试添加用户的方法处理程序中检查Page.IsValid标志,并仅在代码设置为true时运行代码。

您可能还希望使用客户端验证进行验证,这将通过阻止回发来阻止代码执行。为此,您可以在Java Script中实现验证功能,并使用ClientValidationFunction属性将其附加到自定义验证器。

在MSDN上,您可以找到ClientValidationFunction的说明以及如何使用自定义验证器同时使用客户端和服务器端验证的示例:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.customvalidator.clientvalidationfunction%28v=vs.100%29.ASPX

答案 1 :(得分:0)

问题是你的WHERE子句。改为:

string cmdText = "SELECT COUNT(*) FROM Users WHERE username = @username";

这样,它更明确。使用LIKE的前一个查询将匹配包含给定参数值的任何用户名。

<强>更新 此外,@LukaszM在上面的评论中提供了额外的见解。首先将args.IsValid属性设置为true,然后继续尝试使其无效:

public void checkUsername(object source, ServerValidateEventArgs args)
{
    args.IsValid = true;

    string connString = "...";
    string cmdText = "SELECT COUNT(*) FROM Users WHERE username = @username";

    using (SqlConnection conn = new SqlConnection(connString))
    {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand(cmdText, conn))
        {
            cmd.Parameters.AddWithValue("@username", TextBoxUsername.Text);

            int count = (int)cmd.ExecuteScalar();

            if (count > 0)
            {
                args.IsValid = false; 
            }
        }
    }
}

更好的是,我会跳过我添加的初始args.IsValid并继续按如下方式设置:

public void checkUsername(object source, ServerValidateEventArgs args)
{
     string connString = "...";
    string cmdText = "SELECT COUNT(*) FROM Users WHERE username = @username";

    using (SqlConnection conn = new SqlConnection(connString))
    {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand(cmdText, conn))
        {
            cmd.Parameters.AddWithValue("@username", TextBoxUsername.Text);

            int count = (int)cmd.ExecuteScalar();

            args.IsValid = (0 == count); 
        }
    }
}

请记住,如果因任何原因检查数据库失败,您将需要决定该怎么做。

答案 2 :(得分:0)

   var query = from p in _db.MixtapezUser
                        where p.email.ToLower() == login.ToLower() && p.password == password || p.username.ToLower() == login.ToLower() && p.password == password
                        select p;
            _user = query.Count;

对于这种情况需要用户,不安全,任何人都可以。