具有外键关系的mvc模型

时间:2013-04-19 18:07:26

标签: 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 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 ...

修改 修改过的例子..

4 个答案:

答案 0 :(得分:2)

当你点击'SaveBar()'时,模型绑定器似乎将Foo实例化为Bar对象的成员。因此,就像你期望的那样,Foo上的属性验证会触发。

以下是我要做的事情:删除属性验证,然后选择不同的路径,可能就像您从控制器操作中调用正常“Foo”操作的自定义验证方法。 “SaveBar()”可以检查Foo的默认状态,并决定是否调用该验证,具体取决于。

答案 1 :(得分:0)

它不像你想象的那样工作。 ModelState无效,因为您根据需要声明了Foo字段。如果您的观点不接受并传递Foo.IdFoo.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来创建自定义模型绑定器。