【问题标题】:Appropriate way to set default values for ViewModel in MVC4?在 MVC4 中为 ViewModel 设置默认值的适当方法?
【发布时间】:2013-02-11 17:07:40
【问题描述】:

我有一个包含以下内容的 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 设置默认值?

如果我想在卡片创建时将空白面插入面中,方法会改变吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


    【解决方案1】:

    您可以在构造函数中设置默认值:

    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 类中的 Commit 方法上,我会做这样的事情来为所有实现接口的实体设置日期:

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

      通过这种方式,您可以完全确定实体在持久保存在数据库时使用正确的 DateTime 进行存储。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多