Asp.net mvc 具有外键关系的mvc模型

Asp.net mvc 具有外键关系的mvc模型,asp.net-mvc,model-view-controller,asp.net-mvc-4,data-annotations,Asp.net Mvc,Model View Controller,Asp.net Mvc 4,Data Annotations,我对包含外来对象模型的模型存在数据注释验证问题 比方说 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 AnotherN

我对包含外来对象模型的模型存在数据注释验证问题

比方说

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时,FOO不是必需的

但是,当我试图检查BAR的HTTPPOST中的ModelState时,它会说ModelState无效,并报告FOO列丢失

[HTTPPOST]
public ActionResult SaveBar(BAR bar)
{
if (ModelState.IsValid)
    SaveBar(bar);

} 
我已经将FOO设置为null,就像尝试TryUpdateModel一样,但仍然没有帮助

编辑 我处理的是实体,而不是视图模型

而且。。如何告诉模型绑定器在绑定条时不检查FOO

编辑
修改后的示例

它不像你想象的那样工作。
ModelState
无效,因为您根据需要声明了
Foo
的字段。如果您的视图不接受并传递
Foo.Id
Foo.Name
的值,那么您将得到一个无效的
ModelState
不要在您的模型Id上使用
[必需的]
。我不确定您在这里处理的是实体还是视图模型,但一般来说,应该允许取消设置Id。对于实体,在将id保存到数据库(通常)之前不会设置id;对于视图模型,可能表示以前未保存的实体(因此没有id)

[Required]
只有两个真正的用途,因此您应该确切了解它们是什么,然后只相应地应用属性:

1) 在实体上,
[Required]
表示不为空。它只在字符串上有意义,因为默认情况下,其他标量类型都不是NULL


2) 在用于从POST接受表单数据的视图模型上。这将要求该字段不为空。如果您的id不是呈现给用户以供输入的表单字段(我对此深表怀疑),那么就不需要它。

当您点击“SaveBar()”时,模型绑定器似乎正在将Foo实例化为Bar对象的一个成员。因此,Foo上的属性验证将激发,正如您所期望的那样


下面是我要做的:删除属性验证,然后换一条路走,可能像一个自定义的验证方法,您可以从控制器操作中调用它来执行正常的“Foo”操作。“SaveBar()”可以检查Foo的默认状态,并决定是否调用该验证,这取决于。

@hgrathi,您不理解的是,一旦您在Foo Required中命名,现在就需要在Bar下调用Foo


解决此问题的一种方法是通过实现IModelBinder创建自定义模型绑定器。

但在栏中,我没有按要求注释FOO,因此不应选中FOO。。。。还有如何解决这个问题?是的,这是正确的,但接受输入的不是Foo对象本身,而是它的字段,对吗。所以验证是针对Foo的字段进行的。我刚刚创建了这个示例(修复了它,Id没有标记为必需的)。。。但我面临的真正问题是,如何避免在默认情况下处理BARThat的验证期间检查FOO的属性。如果您没有在
Bar
中初始化
Foo
,那么您的属性
Foo
将为空,因为它不是必需的,验证将顺利进行。但是,如果
foo
foo
的一个实例,那么
Bar
也必须有效。这是常识,;否则,
ModelState.IsValid
将毫无意义,因为像将实体保存到数据库这样的操作在保存
Foo
时仍然会失败。抱歉,我重新更新了我的示例,以便更清楚地了解。。。这些字段定义为属性。。。它正在酒吧里检查食物。。。属性n虚拟需求来自NHibernate为什么要将标量属性虚拟化?不过,这有点离题了。你添加的任何内容都不会减损我在上一次评论中所说的内容。如果
foo
已初始化并且具有任何必需的属性,则必须填写这些属性,以便模型进行验证。这也是常识。如果
Bar
具有
Foo
且该
Foo
无效,
Bar
本身也无效。这就像试图把引擎从车里取出来,然后说这辆车仍然有油门,所以它应该继续行驶。但是FOO是可选的。。但我还是要为它提供价值。。困惑。。。。此外,虚标量性质也是Nhibernate的要求。。。