2013-02-11 3 views
5

У меня есть ViewModel, который содержит следующее:Соответствующий способ установки значений по умолчанию для ViewModel в 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; } 

    } 

Модель выглядит следующим образом:

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 и проверяете, что установленная дата установлена ​​на известное значение, вы можете посмотреть на создание отдельной концепции времени, как описано в . Вы в основном создаете статический func, 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.

Хотя мне лично не нравится устанавливать CreateDate в конструкторе, так как может быть короткий промежуток времени, так как вы создаете экземпляр объекта и сохраняете его в базе данных. (И здесь я предполагаю, что вы определенно есть)

Вы могли бы сделать все ваши объекты домена наследовать от интерфейса, как это:

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

Таким образом, вы полностью уверены, что объект сохраняется с правильным DateTime, когда он упорствовал в базе данных.

Смежные вопросы