我正在使用包含异物模型的模型进行数据注释验证问题。
让我们说
Class Foo
{
public virtual Int Id {get; set;}
[Required]
public virtual String Name {get; set;}
}
Class Bar
{
public virtual Int Id {get; set;}
[Required]
public virtual String AnotherName {get; set;}
public virtual Foo foo {get; set;}
}
创建BAR时,不是强制性/必需的。
但是当我尝试检查BAR的HTTPPOST中的ModelState时,它说模型状态无效,并报告FOO的列丢失。
[HTTPPOST]
public ActionResult SaveBar(BAR bar)
{
if (ModelState.IsValid)
SaveBar(bar);
}
我已经将FOO设置为null,就像尝试过TryUpdateModel一样,但仍然没有帮助。
修改 我正在处理实体而不是查看模型
还有..如何告诉模型绑定器在绑定BAR时不检查FOO ...
修改 修改过的例子..
答案 0 :(得分:2)
当你点击'SaveBar()'时,模型绑定器似乎将Foo实例化为Bar对象的成员。因此,就像你期望的那样,Foo上的属性验证会触发。
以下是我要做的事情:删除属性验证,然后选择不同的路径,可能就像您从控制器操作中调用正常“Foo”操作的自定义验证方法。 “SaveBar()”可以检查Foo的默认状态,并决定是否调用该验证,具体取决于。
答案 1 :(得分:0)
它不像你想象的那样工作。 ModelState
无效,因为您根据需要声明了Foo
字段。如果您的观点不接受并传递Foo.Id
和Foo.Name
的值,那么您将获得无效的ModelState
。
答案 2 :(得分:0)
请勿在模特的ID上使用[Required]
。我不确定你是在处理实体还是在这里查看模型,但一般来说,应该允许不设置id。对于实体,在将其保存到数据库(通常)之前不会设置id,而在视图模型的情况下,您可能代表以前未保存的实体(因此没有id)
[Required]
只有两个实际用途,因此您应该准确理解它们是什么,然后才相应地应用该属性:
1)在实体上,[Required]
意味着NOT NULL。它实际上只对字符串有意义,因为默认情况下每个其他标量类型都是NOT NULL。
2)在用于接受来自POST的表单数据的视图模型上。这将要求该字段不为空白。如果你的id不是一个表单字段被呈现给用户输入(我非常怀疑它是),那么它应该不。
答案 3 :(得分:0)
@hgrathi,您不理解的是,只要您在Foo中创建了Name,就在条形码下现在需要Foo。
解决此问题的一种方法是通过实现IModelBinder来创建自定义模型绑定器。