2013-02-11 84 views
5

我有一個包含以下內容的視圖模型:在MVC4中爲ViewModel設置默認值的適當方法?

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; } 

    } 

的模型如下:

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; } 

    } 

我如何設置dateCreated會默認值?

如果我想在創建卡片時將空白側插入側面,方法會改變嗎?

回答

8

你可以在構造函數中設置默認值:

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

警告:有使用DateTime.Now從單元測試的角度來看問題。如果您要對您的ViewModel創建進行單元測試,並且需要驗證創建的日期是否已設置爲已知值,那麼您可以考慮創建一個單獨的時間概念,詳見Ayende's blog。您基本上創建了一個靜態函數,即SystemTime,您可以在測試中將其設置爲已知值。如果不設置,則默認爲DateTime.Now:然後

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

你的構造函數代碼變爲:

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

如果你需要時間來實際設置爲已知值,你這樣做:

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

我同意SystemTime方法。

雖然,我個人不喜歡在構造函數上設置CreatedDate,因爲自實例化對象並將其持久化到數據庫時可能會有短暫的時間間隔。 (在這裏,我假設你肯定是)

你可以讓所有的域對象從這樣一個接口繼承:

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

,然後Commit方法INT Context類,我會做什麼這樣的設置日期爲實現該接口的所有實體:

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

這樣,你完全可以肯定,實體存儲與正確的日期時間,當它在數據庫中仍然存在。