Rails具有非常方便的唯一性验证。
ASP.NET MVC没有。
我需要确保用户输入的电子邮件地址尚未被任何人注册。
我只能看到一种做这种验证的方法:在UniqueAttribute类中创建一个新的数据上下文对象。
但是我担心仅仅为了一次验证而在新数据上下文对象上浪费内存是危险的。
我错了吗?有没有更好的方法呢?
更新
这是我到目前为止所得到的
public class UniqueEmailAttribute : ValidationAttribute {
public override bool IsValid(object value) {
DataContext db = new DataContext();
var userWithTheSameEmail = db.Users.SingleOrDefault(
u => u.Email == (string)value);
return userWithTheSameEmail == null;
}
}
// Usage
[UniqueEmail(ErrorMessage="This e-mail is already registered")]
public string Email { get; set; }
有两个问题。
最好只有一个UniqueAttribute类,而不是单独的电子邮件类,用户名等。我该怎么做?
每次需要验证单个属性时,都会创建新数据上下文。
解
所以最后我在表上创建了一个唯一的约束,现在我只需要在Users存储库中拦截SqlException。效果很好,可能比在整个表中搜索相同的节点更有效。谢谢!
答案 0 :(得分:7)
Mvc 3 Relaease候选者将新的验证属性作为远程验证 - 您可以在clientside(jquery)上注册验证方法。
见下面的例子 - RemoteAttribute
新的RemoteAttribute验证属性利用了jQuery Validation插件的远程验证器,它使客户端验证能够调用执行实际验证逻辑的服务器上的方法。
在以下示例中,UserName属性已应用RemoteAttribute。在“编辑”视图中编辑此属性时,客户端验证将在UsersController类上调用名为UserNameAvailable的操作,以验证此字段。
public class User {
[Remote("UserNameAvailable", "Users")]
public string UserName { get; set; }
}
以下示例显示了相应的控制器。
public class UsersController {
public bool UserNameAvailable(string username) {
return !MyRepository.UserNameExists(username);
}
}
更新
public bool UserNameAvailable(string Propertyname)
{
if (Request.QueryString[0]= "UserName")
{
//validate username
}
elseif (Request.QueryString[0]= "Email")
{
//Validate Email
}
}
答案 1 :(得分:2)
ASP.Net确实有一项功能,可以在用户注册时自动检查用户电子邮件地址的唯一性。它是ASP.Net会员服务,即使您不使用它的所有功能,您也可以使用它来做您想做的事情。
如果您没有在MVC应用程序中使用完整的成员身份功能,那么您需要做的就是使用
Membership.FindUsersByEmail(emailYouAreLookingFor);
如果有任何值返回,您知道该地址不是唯一的。如果您使用会员服务来创建用户,则会员服务将自动检查并在用户的电子邮件地址不唯一时向您返回代码。
Membership服务位于System.Web.Security区域,因此您需要
在您的控制器中使用System.Web.Security;
参考。
这是一个例子
MembershipCreateStatus createStatus = MembershipService.CreateUser(UserName, Password, Email); if (createStatus == MembershipCreateStatus.DuplicateEmail) { //do something here } else { //do something here }
我希望这有帮助!
答案 2 :(得分:2)
可以在this MVC forum.中通过counsellorben找到在MVC中制作通用远程唯一验证器的正确方法。它基于我的MVC唯一远程验证器文章http://msdn.microsoft.com/en-us/library/gg508808(VS.98).aspx
答案 3 :(得分:1)
这样做的一个简单方法是创建一个验证属性,该属性将在数据库中查询电子邮件地址。它肯定会增加延迟。
另一种方法是在表上创建一个唯一约束并拦截SqlException。