2013-02-11 26 views
5

Tôi có một ViewModel có chứa những điều sau đây: Cách thích hợp để đặt giá trị mặc định cho ViewModel trong MVC4?

public class CreateCardViewModel 
    { 
     [HiddenInput(DisplayValue = false)] 
     public int SetId { get; set; } 

     [Required] 
     public IList<Side> Sides { get; set; } 

     [Required] 
     public int Stage { get; set; } 

     [Required] 
     [DataType(DataType.Date)] 
     [HiddenInput(DisplayValue = false)] 
     public DateTime DateCreated { get; set; } 

     [Required] 
     public bool IsReady { get; set; } 

    } 

mô hình

là như sau:

public class Card 
    { 

     public virtual int CardId { get; set; } 

     // belongs to a Set 
     public virtual int SetId { get; set; } 
     public virtual Set Set { get; set; } 

     // has Sides 
     public virtual IList<Side> Sides { get; set; } 

     // is in a certain Stage 
     public virtual int Stage { get; set; } 

     // is ready to study 
     public virtual bool IsReady { get; set; } 

     public virtual DateTime DateCreated { get; set; } 

    } 

Làm thế nào tôi có thể thiết lập một giá trị mặc định cho DateCreated?

Phương thức có thay đổi không nếu tôi muốn chèn Mặt trống vào Mặt khi tạo thẻ?

Trả lời

8

Bạn có thể thiết lập giá trị mặc định trong constructor:

public CreateCardViewModel() 
{ 
    DateCreated = DateTime.Now; 
    Sides = new List<Side> { new Side() }; 
} 

Nên biết trước: Có một vấn đề với việc sử dụng DateTime.Now từ góc độ kiểm tra đơn vị. Nếu bạn đang thử nghiệm đơn vị tạo ViewModel của mình và cần xác minh rằng ngày được tạo được đặt thành giá trị đã biết, bạn có thể xem xét tạo khái niệm riêng cho thời gian, như được mô tả chi tiết trong Ayende's blog. Về cơ bản bạn tạo một func tĩnh, SystemTime, mà bạn có thể đặt thành một giá trị đã biết trong các thử nghiệm của mình. Nếu bạn không đặt nó, nó mặc định là DateTime.Now:

public static class SystemTime 
{ 
    public static Func<DateTime> Now =() => DateTime.Now; 
} 

đang constructor của bạn sau đó trở thành:

public CreateCardViewModel() 
{ 
    DateCreated = SystemTime.Now(); 
    Sides = new List<Side> { new Side() }; 
} 

Nếu bạn cần phải thực sự thiết lập thời gian để một giá trị đã biết, bạn làm như sau:

SystemTime.Now =() => new DateTime(2013, 2, 11, 17, 41, 12); 
2

Tôi đồng ý về phương pháp SystemTime.

Mặc dù, cá nhân tôi không thích cài đặt CreatedDate trên hàm tạo vì có thể mất một khoảng thời gian ngắn kể từ khi bạn khởi tạo đối tượng và khi bạn lưu giữ nó vào cơ sở dữ liệu. (Và ở đây tôi giả sử bạn chắc chắn là)

Bạn có thể làm cho tất cả đối tượng tên miền của bạn kế thừa từ một giao diện như thế này:

public interface ITimeStamped 
{ 
    DateTime DateCreated { get; set; } 
} 

Và sau đó vào Commit phương pháp int lớp Context tôi sẽ làm một cái gì đó như thế này để đặt ngày cho tất cả các thực thể triển khai giao diện:

foreach (var entry in ChangeTracker.Entries<ITimeStamped>() 
       .Where(entry => entry.State == EntityState.Added)) 
      { 
       entry.Entity.DateCreated = SystemTime.Now(); 
      } 

Bằng cách này bạn hoàn toàn chắc chắn rằng pháp nhân được lưu trữ đúng DateTime khi được lưu giữ trên cơ sở dữ liệu.

Các vấn đề liên quan