所以我的 Models
目录中有一个实体:
public class Event
{
public int Id { get; set; }
[Required, MaxLength(50), MinLength(3)]
public string Name { get; set; }
[Required, MaxLength(2000)]
public string Description { get; set; }
}
我想使用 viewModel 将它暴露给 View :
public class BaseEventViewModel
{
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
}
public class EventCreateViewModel : BaseEventViewModel
{
}
我的理由是,我希望所有的数据验证都在实体上完成,所有的展示内容(比如呈现文本区域)都在 View 模型上完成。然后,我可以使用任意多的 View 模型来表示我的实体,同时保持数据完整性。
所以我更改了我的 Controller 以使用新的 View 模型:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(EventCreateViewModel viewModel)
{
if (ModelState.IsValid)
{
db.Events.Add(new Event
{
Name = viewModel.Name,
Description = viewModel.Description
});
db.SaveChanges();
return RedirectToAction("Index");
}
return View(viewModel);
}
但是,没有完成任何实体验证,我可以提交一个空白表单,该表单会引发 DbEntityValidationException
异常。
大概这是因为 ModelState.IsValid
正在处理 View 模型,而不是 View 模型表示的实体。我怎样才能捕捉到这些验证错误?
最佳答案
在正确的指导下,我实际上找到了答案。如果我将此注释添加到我的 View 模型,它将继承应用于我的实体属性的所有注释:
[MetadataType(typeof(Event))]
public class BaseEventViewModel
{
public int Id { get; set; }
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
}
现在,当我提交空白表单时,我会正常显示验证错误。
这确实伴随着必须在我的 View 模型中再次重新定义每个属性的警告,这有点违背了 View 模型只包含您需要的属性的观点,但它适用于我的情况。
关于c# - 在 Controller 内部使用 View 模型时,如何在实体内部保留验证规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28157722/