1

我已经定义了一个具有一些属性的基类,例如:

public string CreatedByName { get; set; }
public DateTime CreatedOn { get; set; }

public string UpdatedByName { get; set; }
public DateTime UpdatedOn { get; set; }

如果我在我的控制器中创建一个继承自这个基类的模型对象,如下所示:

[HttpPost]
public ActionResult Create(Person person)
{
    if (ModelState.IsValid)
    {
        person.Id = Guid.NewGuid();

        //audit information
        person.UpdatedByName = User.Identity.Name;
        person.UpdatedOn = DateTime.Now;
        person.CreatedByName = User.Identity.Name;
        person.CreatedOn = DateTime.Now;            

        UoW.Persons.Add(person);
        UoW.Commit();
        return RedirectToAction("Index");
    }
    return View(person);
}

它永远不会像ModelState.IsValid往常一样返回false,因为在此阶段尚未设置审计属性。

有没有办法在某个常见的地方设置这种值(我试图编写帮助类,但如何获得User?)并且在模型验证开始之前?

或者唯一的选择是使审计属性为 nullabe [不需要]?

编辑:-

尝试了@archil的建议:

哈哈哈............在Get行动中做到这一点

public ActionResult Create()
{
    var person=new Person();
    person.UpdatedByName = User.Identity.Name;
    person.UpdatedOn = DateTime.Now;
    person.CreatedByName = User.Identity.Name;
    person.CreatedOn = DateTime.Now;

    return View(person);

仍然得到:

  • CreatedOn 字段是必需的。
  • UpdatedOn 字段是必需的。
4

1 回答 1

2

这就是为什么您应该在控制器操作中使用 ViewModel,而不是域模型。Viewmodel 将仅包含创建人员所需的属性,您可以稍后在已验证的模型上设置审核和所有其他值。

[HttpPost]
public ActionResult Create(CreatePersonViewModel createPerson)
{
    if (ModelState.IsValid)
    {
        Peron person = MapViewModel(createPerson);

        //audit information
        person.UpdatedByName = User.Identity.Name;
        person.UpdatedOn = DateTime.Now;
        person.CreatedByName = User.Identity.Name;
        person.CreatedOn = DateTime.Now;            

        UoW.Persons.Add(person);
        UoW.Commit();
        return RedirectToAction("Index");
    }
    return View(createPerson);
}

对于映射,您可以使用广泛使用的AutoMapper或类似的

更新

您可以使用Controller.UpdateModelController.TryUpdateModel手动调用模型绑定和验证

像这样的东西

[HttpPost]
public ActionResult Create()
{
    Person person = new Person();
    person.UpdatedByName = User.Identity.Name;
    person.UpdatedOn = DateTime.Now;
    person.CreatedByName = User.Identity.Name;
    person.CreatedOn = DateTime.Now;    


    if (TryUpdateModel(person))
    {
        UoW.Persons.Add(person);
        UoW.Commit();
        return RedirectToAction("Index");
    }
    return View(person );
}
于 2012-10-21T16:13:40.203 回答