C# ASP MVC中唯一性的远程验证
使用ASP MVC和SQL Server,我试图在通过电子邮件价值的唯一性创建客户机之前测试客户机的存在性 经过大量的教程和解决方案,我没有成功地解决这个问题。这就是我尝试过的: 客户端控制器: 模型客户端: 视图创建:C# ASP MVC中唯一性的远程验证,c#,jquery,sql-server,asp.net-mvc,C#,Jquery,Sql Server,Asp.net Mvc,使用ASP MVC和SQL Server,我试图在通过电子邮件价值的唯一性创建客户机之前测试客户机的存在性 经过大量的教程和解决方案,我没有成功地解决这个问题。这就是我尝试过的: 客户端控制器: 模型客户端: 视图创建: 您需要在数据库中的电子邮件上添加唯一约束或唯一索引 即使在插入之前检查是否存在,并发请求也可能导致重复。因此,让数据库强制执行唯一性,并处理在尝试插入副本时返回的错误。您需要在数据库中的电子邮件上添加唯一约束或唯一索引 即使在插入之前检查是否存在,并发请求也可能导致重复。因此,
您需要在数据库中的电子邮件上添加唯一约束或唯一索引
即使在插入之前检查是否存在,并发请求也可能导致重复。因此,让数据库强制执行唯一性,并处理在尝试插入副本时返回的错误。您需要在数据库中的电子邮件上添加唯一约束或唯一索引
即使在插入之前检查是否存在,并发请求也可能导致重复。因此,让数据库强制执行唯一性,并处理在尝试插入副本时返回的错误。您当前的代码正在重新检查客户端的空列表。您应该对照现有数据进行检查 您可以编写一个方法来检查它
private bool DoesEmailExist(string email)
{
var conStr = @"putYourConnectionStringHere";
var q = "select TOP 1 Email from Client WHERE Email=@email";
using (var c =new SqlConnection(conStr))
{
using (var cmd = new SqlCommand(q, c))
{
c.Open();
cmd.Parameters.AddWithValue("@email", email);
var r = cmd.ExecuteReader();
return r.HasRows;
}
}
}
现在在另一个方法中调用此方法。当电子邮件存在于系统中时,IsClient列表应返回false;当电子邮件不存在于数据库中时,IsClient列表应返回true。因此,基本上,您需要否定doeSmailexist方法返回的结果
请记住,这只进行客户端验证。永远不要信任来自客户端的数据。始终在服务器端验证。您应该添加数据库级别的约束,以防止重复的电子邮件保存在表中,正如@David Browne在其回答中提到的那样您当前的代码正在检查一个空的客户端列表。您应该对照现有数据进行检查 您可以编写一个方法来检查它
private bool DoesEmailExist(string email)
{
var conStr = @"putYourConnectionStringHere";
var q = "select TOP 1 Email from Client WHERE Email=@email";
using (var c =new SqlConnection(conStr))
{
using (var cmd = new SqlCommand(q, c))
{
c.Open();
cmd.Parameters.AddWithValue("@email", email);
var r = cmd.ExecuteReader();
return r.HasRows;
}
}
}
现在在另一个方法中调用此方法。当电子邮件存在于系统中时,IsClient列表应返回false;当电子邮件不存在于数据库中时,IsClient列表应返回true。因此,基本上,您需要否定doeSmailexist方法返回的结果
请记住,这只进行客户端验证。永远不要信任来自客户端的数据。始终在服务器端验证。您应该添加数据库级别的约束,以防止重复的电子邮件保存在表中,正如@David Browne在其回答中提到的那样您的iClient列表的命名引起了我的问题。若客户端存在,它将返回false,因为任何语句前面都有感叹号。您还可以查看空列表中是否有任何内容,这将始终为false,因此该方法将始终返回true。为什么不检查用户是否存在,以及他们是否不添加。。。如果他们真的更新了…不仅如此。你在否定你的结果。因此,如果该列表中确实存在客户机,您的isClientList方法将返回false。因此,在我看来,您需要将数据加载到该列表中,并删除您的任何语句前的感叹号。只需查询数据库或缓存以获取当前电子邮件列表,并对照该列表进行检查。@Exact Yes。请看我在下面发布的答案。您的iClientExist的命名引起了我的问题。若客户端存在,它将返回false,因为任何语句前面都有感叹号。您还可以查看空列表中是否有任何内容,这将始终为false,因此该方法将始终返回true。为什么不检查用户是否存在,以及他们是否不添加。。。如果他们真的更新了…不仅如此。你在否定你的结果。因此,如果该列表中确实存在客户机,您的isClientList方法将返回false。因此,在我看来,您需要将数据加载到该列表中,并删除您的任何语句前的感叹号。只需查询数据库或缓存以获取当前电子邮件列表,并对照该列表进行检查。@Exact Yes。请看我在下面发布的答案。非常感谢@Shyju,它很有效,只是有一点错误。对于未来的读者:我们必须使用Email,而不是命名sql命令,因为我们正在测试Email:var q=select TOP 1 Email from Client,其中Email=@Email;非常感谢@Shyju,这是有效的,只是一个小错误。对于未来的读者:我们必须使用Email,而不是命名sql命令,因为我们正在测试Email:var q=select TOP 1 Email from Client,其中Email=@Email;
public class Client
{
[Display(Name = "Email")]
[Required(ErrorMessage = "Email is required.")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
[DataType(DataType.EmailAddress)]
[StringLength(30)]
[Remote("IsClientExist", "Client", ErrorMessage = "Email is already exists in Database.")]
public string Email { get; set; }
[Display(Name = "Password")]
[DataType(DataType.Password)]
[Required(ErrorMessage = "Password is required.")]
public string Password { get; set; }
}
<div class="form-group">
@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
</div>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
private bool DoesEmailExist(string email)
{
var conStr = @"putYourConnectionStringHere";
var q = "select TOP 1 Email from Client WHERE Email=@email";
using (var c =new SqlConnection(conStr))
{
using (var cmd = new SqlCommand(q, c))
{
c.Open();
cmd.Parameters.AddWithValue("@email", email);
var r = cmd.ExecuteReader();
return r.HasRows;
}
}
}
public JsonResult IsClientExist(string Email)
{
var r = DoesEmailExist(Email);
return Json(!r, JsonRequestBehavior.AllowGet);
}