我有一个ViewModel,它有一些DataAnnotations验证,然后对于更复杂的验证实现IValidatableObject并使用Validate方法.
我期待的行为是这样的:首先是所有DataAnnotations,然后,只有在没有错误的情况下,验证方法.我怎么发现这并非总是如此.我的ViewModel(演示版)有一个string,一个decimal和一个文件decimal?.所有这三个属性都只有Required属性.对于string和,decimal?行为是预期的行为,但对于decimal,当为空时,必需的验证失败(到目前为止很好),然后执行Validate方法.如果我检查属性,它的值为零.
这里发生了什么?我错过了什么?
注意:我知道必须使用Required属性来检查值是否为null.所以我希望被告知不要在不可空类型中使用Required属性(因为它不会触发),或者,某种程度上该属性理解POST值并注意该字段未被填充.在第一种情况下,属性不应该触发,并且应该触发Validate方法.在第二种情况下,属性应该触发,并且不应触发Validate方法.但我的结果是:属性触发器和Validate方法触发.
这是代码(没什么特别的):
控制器:
public ActionResult Index()
{
return View(HomeModel.LoadHome());
}
[HttpPost]
public ActionResult Index(HomeViewModel viewModel)
{
try
{
if (ModelState.IsValid)
{
HomeModel.ProcessHome(viewModel);
return RedirectToAction("Index", "Result");
}
}
catch (ApplicationException ex)
{
ModelState.AddModelError(string.Empty, ex.Message);
}
catch (Exception ex)
{
ModelState.AddModelError(string.Empty, "Internal error.");
}
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
模型:
public static HomeViewModel LoadHome()
{
HomeViewModel viewModel = new HomeViewModel();
viewModel.String = string.Empty;
return viewModel;
} …Run Code Online (Sandbox Code Playgroud) asp.net asp.net-mvc data-annotations asp.net-mvc-3 ivalidatableobject