2015-12-02 38 views
1

有兩種模式
用戶代碼首先在數據庫中添加默認字段值(ASP.NET MVC)

public class User 
{ 
private const int NameLength = 200; 
private const int EmailLength = 100; 

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int Id { get; set; } 

[StringLength(NameLength)] 
public string Name { get; set; } 

[Required] 
[EmailAddress] 
[StringLength(EmailLength)] 
public string Email { get; set; } 

[Required] 
[DataType(DataType.Password)] 
[StringLength(200)] 
public string Password { get; set; } 

public string PasswordSalt { get; set; } 

[Required] 
[DefaultValue(UserType.User)] 
public UserType Type { get; set; } 

[DefaultValue(true)] 
public bool IsActive { get; set; } 

public virtual List<Task> Tasks { get; set; } 

public User() 
{ 
    Tasks = new List<Task>(); 
} 
} 
[Flags] 
public enum UserType 
{ 
    Admin = 0, 
    User = 1 
} 

RegisterUserModel我用註冊用戶

public class RegisterUserModel 
{ 
    private const int NameLength = 200; 
    private const int EmailLength = 100; 
    private const int PasswordMinLength = 5; 
    private const int PasswordMaxLength = 20; 

    [Key] 
    public int Id { get; set; } 

    [Required] 
    [StringLength(NameLength)] 
    public string Name { get; set; } 

    [Required] 
    [EmailAddress] 
    [StringLength(EmailLength)] 
    public string Email { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [StringLength(PasswordMaxLength, MinimumLength = PasswordMinLength)] 
    public string Password { get; set; } 
} 

這是我的控制器的方法

[HttpPost] 
[AjaxAction] 
public ActionResult Registration(RegisterUserModel registerUser) 
{ 

if (ModelState.IsValid) 
{ 
    if (!IsUserExist(registerUser.Email)) 
    {  
     var crypto = new SimpleCrypto.PBKDF2(); 

     var encrpPass = crypto.Compute(registerUser.Password); 

     var newUser = db.Users.Create(); 

     newUser.Name = registerUser.Name; 
     newUser.Email = registerUser.Email; 
     newUser.Type = UserType.User; 
     newUser.IsActive = true; 

     newUser.Password = encrpPass; 
     newUser.PasswordSalt = crypto.Salt; 

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

     FormsAuthentication.SetAuthCookie(newUser.Email, false); 

     return Json(new {status = "OK", message = "Success"}, JsonRequestBehavior.AllowGet); 
    } 
    return Json(new { status = "ERROR", message = "User already exists" }, JsonRequestBehavior.AllowGet); 
} 
return Json(new { status = "ERROR", message = "Data is incorrect" }, JsonRequestBehavior.AllowGet); 
} 

而且我不喜歡,我需要設置值

newUser.Type = UserType.User; 
newUser.IsActive = true; 
在控制器手動雖然我在 用戶模型這些默認值

,我認爲這不是很好的做法,但我不知道如何避免它?

回答

2

DefaultValueAttribute不會做你認爲它所做的事情,也就是說,實際上設置了該屬性的實際值。如果您希望屬性有一個默認值,那麼你需要一個自定義的getter和setter:

private UserType? type; 
public UserType Type 
{ 
    get { return type ?? UserType.User; } 
    set { type = value; } 
} 
+0

Veeery intresting,我相信'DefaultValueAttribute'應該工作完全這樣)非常感謝的建議,我會嘗試使用它! – Heidel

+0

不是。它被.NET的某些部分(主要是序列化器)使用,但它不是通用的,並且在MVC或實體框架的上下文中不做任何事情。 –

1

在這種情況下,你可以使用屬性爲用戶設置的值,也可以創建一個構造函數和在內部設置這些屬性..

如果您不喜歡手動設置屬性,則可以使用映射工具(如AutoMapper(http://automapper.org/))爲您執行映射。

問候,

+0

謝謝你的幫助! – Heidel

相關問題