2013-02-11 7 views
5

私は次の内容が含まれていViewModelにあります: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; } 
} 

そして、私が何かをするだろうContextクラスのint Commitメソッドに:

あなたはすべてのドメインオブジェクトが、このようなインタフェースから継承させることができた(そして、ここで私は間違いなくあなたを想定しているのです)

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

あなたはそれがデータベースに永続化されたときに実体が正しい日時に格納されていることを完全に特定している。この方法:インターフェイスを実装するすべてのエンティティの日付を設定するには、このような。

関連する問題