2013-10-20 140 views
0

我的用户模型是这样的:模型验证和注册

public class User 
{ 
    [Key] 
    [Required] 
    [StringLength(30, MinimumLength = 3)] 
    [Display(Name = "Username")] 
    public String Name { get; set; } 

    [EmailAddress] 
    [Required] 
    [MaxLength(254)] 
    [Display(Name="Email address")] 
    public String Email { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [StringLength(20, MinimumLength = 6)] 
    public String Password { get; set; } 

休息是无关紧要的。

我有以下问题:当我尝试在我需要输入一个电子邮件地址,因为它是[Required]ModelState.IsValid将返回false,如果我不会和登录逻辑将跳过......我不能删除[Required]堂妹验证记录我需要注册,但我也想让用户只用用户名登录。有没有什么方法让电子邮件只需要注册?如果不是你建议我做什么,请从电子邮件中删除要求?

登录:

if (ModelState.IsValid) 
     { 
      if (IsValid(user.Name, user.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(user.Name, false); 
       return RedirectToAction("Index", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Login Data is incorrect"); 
      } 
     } 

和注册:

if (ModelState.IsValid) 
     { 
      using (var db = new CardContext()) 
      { 
       var crypto = new SimpleCrypto.PBKDF2(); 

       var encrPass = crypto.Compute(user.Password); 

       var sysUser = db.Users.Create(); 

       sysUser.Avatar = null; 
       sysUser.Banned = false; 
       sysUser.Email = user.Email; 
       sysUser.Information = ""; 
       sysUser.Name = user.Name; 
       sysUser.Password = encrPass; 
       sysUser.Rank = null; 
       sysUser.Salt = crypto.Salt; 

       db.Users.Add(sysUser); 
       db.SaveChanges(); 

       return RedirectToAction("Index", "Home"); 
      } 
     } 
     else 
     { 
      ModelState.AddModelError("", "Registration data is incorrect."); 
     } 

回答

2

我建议使用两个独立的View Models -

  • 视图模型登记,使得电子邮件所需
  • 未提供必需电子邮件的登录视图模型。

他们是视图模型有两个不同的目的,所以虽然看起来像重复,但我会认为它不是。

+0

当用户注册时,我将不得不复制从注册模式到登录的所有内容。或仅使用登录模型进行登录验证,并使用其他所有模型的登录模型?这听起来有点奇怪,有2个模型,只有[Register]属性的不同。 – Kmaczek

+0

您在业务层中表示用户的类。我建议不要从View传递值并绑定到此类型的实例,而是使用两个不同的View Model,而不是在它们上具有Validation属性,然后将View Models中的值映射到'User的实例'登录或注册时。不幸的是,数据注解验证属性默认没有上下文的概念,尽管你可以为此写一个自定义属性。 –

+0

好吧,我现在明白了:)这确实是个好主意。 – Kmaczek