我在asp.net-mvc页面中发布了一个表单。这是我的控制器动作:
public ActionResult UpdateData(MyFormObject entity)
{
bool isValid = IsValid(entity);
if (!isValid)
{
var firstError = ModelState.Values.SelectMany(v => v.Errors).First();
throw new HttpException(404, firstError.ErrorMessage);
}
return Json(BuildResult(entity));
}
即使认为帖子传递了我所有的显式验证逻辑,当我检查ModelState时,我看到错误。当我的任何属性为空时,我在ModelState中看到错误。这是我的目标:
public class MyFormObject
{
public int Id{ get; set; }
public int TestId{ get; set; }
public int OtherId{ get; set; }
}
我正在看Model.State,我看到我的对象中没有填充的任何元素的错误。
如果我将其更改为(注意:“?”)
public class MyFormObject
{
public int? Id{ get; set; }
public int? TestId{ get; set; }
public int? OtherId{ get; set; }
}
然后我不再有任何错误。是否有一些默认验证在这里发生,我没有设置。我试图找出在上面第一种情况下设置ModelState错误的原因。
答案 0 :(得分:3)
当您对以MyFormObject
类对象作为参数的控制器操作进行定位时,MVC引擎将尝试通过自动模型绑定创建该类的实例。为了创建MyFormObject
,需要提供所有这些:
public int Id{ get; set; }
public int TestId{ get; set; }
public int OtherId{ get; set; }
如果您不提供至少其中任何一个,它将尝试将null分配给相应的属性。 int
(值类型)不支持空值,而int?
则支持空值。
这在逻辑上是正确的,实际上可以长期帮助你。
答案 1 :(得分:2)
正如@Maxim V. Pavlov所说,当你发布时,ASP.MVC引擎将尝试验证模型,即它的类,并基于你引用的类作为示例,属性不接受null或空值,然后它将抛出异常,ModelState将无效。
您可以在此处查看更多内容@ Validating Model Data in an MVC Application和ModelStateDictionary.IsValid Property
答案 2 :(得分:0)
您可能正在向UpdateData方法提交一个空的MyFormObject。值类型不能为空,必须分配值。如果值类型缺少值,则它会自动触发必需的字段验证。
ASP.NET MVC甚至有一个允许你调整这种行为的属性,虽然我相信它只会影响客户端验证:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes