在模型验证开始之前在模型上设置审计值

时间:2012-10-21 16:03:43

标签: asp.net-mvc asp.net-mvc-4 model-validation

我已经定义了一个基类,其中包含一些属性:

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?)并且在模型验证开始之前?

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

修改: -

尝试了@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字段。

1 个答案:

答案 0 :(得分:2)

这就是为什么你应该在控制器操作中使用ViewModels,而不是域模型。 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 );
}