检查自定义验证程序中是否存在用户名
本文关键字:存在 用户 是否 自定义 验证 程序 检查 | 更新日期: 2023-09-27 18:06:50
我有这个自定义验证器
<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);
}
}
考虑到您在问题中发布的代码,您似乎只实现了服务器端验证。
请注意,服务器端验证不会阻止代码执行,但仅在验证失败时将Page.IsValid
标志设置为false
。因此,添加用户的代码将始终运行。为了考虑验证的结果,您应该检查尝试添加用户的方法处理程序中的Page.IsValid
标志,并且只有当它设置为true
时才运行代码。
您可能还希望使用客户端验证进行验证,这将通过阻止回发来阻止代码执行。为此,您可以在JavaScript中实现验证函数,并使用ClientValidationFunction
属性将其附加到自定义验证器。
在MSDN上,您可以找到ClientValidationFunction
的描述以及如何使用自定义验证器同时使用客户端和服务器端验证的示例:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.customvalidator.clientvalidationfunction%28v=vs.100%29.ASPX。
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;
需要用户喜欢这种情况,不安全,并允许任何人在任何情况下。
问题出在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);
}
}
}
请记住,如果由于任何原因对数据库进行检查失败,您将需要决定该怎么办。