更新存储时如何自动输入日期和用户名?

时间:2011-07-25 17:29:28

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

我有我的MVC3应用程序使用的以下类。我想要 简化类的更新,以便在新的类对象时 创建然后自动设置Created和CreatedBy字段。

我还想让它变为Modified和ModifiedBy字段 自动更新。

我有办法做到这一点吗?

The class is used in MVCnamespace Storage.Models
{
    public class Topic : TableServiceEntity
    {
        [DisplayName("Partition Key")]
        public override string PartitionKey { get; set; }
        [DisplayName("Row Key")]
        public override string RowKey { get; set; }
        [DisplayName("Description")]
        public string Description { get; set; }
        public DateTime Created { get; set; }
        public DateTime Modified { get; set; }
        public String CreatedBy { get; set; }
        public string ModifiedBy { get; set; }
    }
}

3 个答案:

答案 0 :(得分:2)

在类

的构造函数中设置默认值
public class Topic 
{
    public Topic()
    {
        this.Created = DateTime.Now;
        this.CreatedBy = UserName;
    }
    [DisplayName("Partition Key")]
    public override string PartitionKey { get; set; }
    [DisplayName("Row Key")]
    public override string RowKey { get; set; }
    [DisplayName("Description")]
    public string Description { get; set; }
    public DateTime Created { get; set; }
    public DateTime Modified { get; set; }
    public String CreatedBy { get; set; }
    public string ModifiedBy { get; set; }
}

答案 1 :(得分:1)

乔纳森,

杰森上面给出了构造函数中包含的逻辑的答案是一种非常有效和干净的方法,我不会与之争辩(并且我自己也做了更多'静态'属性)。但是,鉴于在创建对象和实际保存之间可能存在游戏中断,那么您可能还需要考虑将此逻辑放入控制器(或服务层)中。

这看起来大致如下:

public ActionResult Create(MyCreateViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        viewModel.Entity.Created = DateTime.UtcNow;
        _myService.Insert(viewModel.Entity);
        _myService.SaveChanges();
        return this.RedirectToAction(x => x.Index());
    } else {
        PopulateViewModel(viewModel);
        return View(viewModel);
    }
}

同样,您可能拥有要跟踪的LastEdit日期时间。同样使用“编辑”操作:

public ActionResult Edit(MyEditViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        viewModel.Entity.LastEditDate= DateTime.UtcNow;
        _myService.AttachAndUpdate(viewModel.Entity);
        _myService.SaveChanges();
        return this.RedirectToAction(x => x.Index());
    } else {
        PopulateViewModel(viewModel);
        return View(viewModel);
    }
}

确保真正反映与日期时间相关的属性的另一种方法。

答案 2 :(得分:1)

在此解决方案中,我认为您可能需要在存储库/服务层进行重大更改

定义一个接口,如:

public interface IHistoryLog
{
   DateTime Created { get; set; }
   DateTime Modified { get; set; }
   string CreatedBy { get; set; }
   string ModifiedBy { get; set; } 
}

然后:

public class Topic:IHistoryLog
{
// Implement interface..
}

然后创建一个通用服务类:

     public abstract class CRUDService<TModel>
        {
           protected CRUDService(DataContext dataContext)
           {
             // data context to do generic CRUD stuff
           }
           public virtual Save(TModel model) 
           {
              if(model is IHistoryLog)
              {
                 // assign Createdby and Created
              }
           }
           public virtual Update(TModel model) 
           {
              if(model is IHistoryLog)
              {
                // assign ModifiedBy and Modified
              }
           }
        }