ASP.NET MVC验证的唯一性

Ale*_*lex 12 validation asp.net-mvc unique

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; }
Run Code Online (Sandbox Code Playgroud)

有两个问题.

  1. 只有一个UniqueAttribute类,而不是电子邮件,用户名等的单独类,这样会很好.我该怎么做?

  2. 每次需要验证单个属性时创建新的数据上下文.

所以最后我在表上创建了一个唯一的约束,现在我只需要在Users存储库中拦截SqlException.效果很好,可能比在整个表中搜索相同的节点更有效.谢谢!

swa*_*eel 8

Mvc 3 Relaease候选者具有新的验证属性作为远程验证 - 您可以在客户端(jquery)上注册验证方法.

见下面的例子 - RemoteAttribute

新RemoteAttribute验证属性接受jQuery验证插件的远程验证器,其使得客户端验证调用方法执行实际验证逻辑服务器上的优势.

在以下示例中,UserName属性已应用RemoteAttribute.在"编辑"视图中编辑此属性时,客户端验证将在UsersController类上调用名为UserNameAvailable的操作以验证此字段.

public class User {  
    [Remote("UserNameAvailable", "Users")]  
    public string UserName { get; set; }  
}  
Run Code Online (Sandbox Code Playgroud)

以下示例显示了相应的控制器.

public class UsersController {  
        public bool UserNameAvailable(string username) {  
            return !MyRepository.UserNameExists(username);  

       }  
   }
Run Code Online (Sandbox Code Playgroud)

Mvc 3

UPDATE

    public bool UserNameAvailable(string Propertyname)  
    {  
        if (Request.QueryString[0]= "UserName")  
        {   
            //validate username  
        }  
        elseif (Request.QueryString[0]= "Email")  
        {  
            //Validate Email  
        }  

    }   
Run Code Online (Sandbox Code Playgroud)


Dmi*_* S. 1

执行此操作的一种万无一失的方法是创建一个验证属性,该属性将在数据库中查询电子邮件地址。这肯定会增加延迟。

另一种方法是在表上创建唯一约束并拦截 SqlException。

  • 实际上你的“万无一失”的方法并非如此。它创造了一个竞争条件。两个单独的服务器进程可以同时查询同一个电子邮件地址,并且都被告知该地址不在数据库中。然后他们都会尝试拯救它。只有一个人会赢。确保这种唯一性的唯一万无一失的方法是数据库中的唯一约束。 (14认同)