我已经定义了一个基类,其中包含一些属性:
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);
<击> 仍然得到:
答案 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.UpdateModel或Controller.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 );
}