我有一个包含以下内容的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的默认值?
如果我想在创建卡片时在侧面插入空白边,方法会改变吗?
答案 0 :(得分:9)
您可以在构造函数中设置默认值:
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);
答案 1 :(得分:2)
我同意SystemTime方法。
虽然,我个人不喜欢在构造函数上设置CreatedDate,因为自实例化对象以及将其持久保存到数据库后,可能会有很短的时间间隔。 (在这里我假设你肯定是)
您可以使所有域对象都从这样的接口继承:
public interface ITimeStamped
{
DateTime DateCreated { get; set; }
}
然后在Context类的Context方法中,我会做这样的事情来设置实现接口的所有实体的日期:
foreach (var entry in ChangeTracker.Entries<ITimeStamped>()
.Where(entry => entry.State == EntityState.Added))
{
entry.Entity.DateCreated = SystemTime.Now();
}
这样,您可以完全确定实体在数据库中持久存储时具有正确的DateTime。