由于隐藏的id字段,ModelState.IsValid为false

时间:2016-03-03 14:16:45

标签: asp.net-mvc asp.net-mvc-4 razor

ModelState.Isvalid始终显示为false。

我有以下型号

public class MyModel: MyEntity
{
    [Key]
    public int MyModelID { get; set; }
    [Required]
    [StringLength(255)]
    public string Forename { get; set; }
    [Required]
    [StringLength(255)]
    public string Surname { get; set; }
}

我有这个viewmodel

public class MydatabaseVM
{
    public MyModel myMode { get; set; }
    public virtual Tab2 tab2 { get; set; }  
    public virtual Employee employee { get; set; }  
    public virtual Student student { get; set; }  
}

我在视图中使用它

<div id="email" class="tab-pane fade">
    @Html.HiddenFor(model => model.MyModel.MyModelID )
</div>

在我看来,我在隐藏字段中有MyModelID,因为我的页面中有几个标签,我想保留id以传递给其他标签。

保存后,我需要隐藏字段中的MyModelID。在这里,如果我点击保存,当它到达后期操作时,ModelState.IsValid总是返回false。

我尝试删除隐藏的字段,它就像真的一样。你能帮我解决一下我在做错的事吗?我的实际需求是在一个页面中我有多个选项卡,主选项卡有一些基本的detials。当我在第一个选项卡上保存数据时,细节应该转到数据库,并且应该生成和id。当我点击其他选项卡时(使用ajax和jquery)应该传递给那些并且数据应该保存到表tab2

1 个答案:

答案 0 :(得分:0)

ModelState无效,因为您在视图中使用的数据模型包含2个属性(ForenameSurname),这些属性使用[Required]属性修饰并且您拥有没有为他们发布值。

当您删除隐藏的输入时,DefaultModelBinder会初始化MydatabaseVM的新实例,但myMode的值是默认值null,因此没有任何内容验证

但是当您包含隐藏的输入时,会发布其值,这会强制DefaultModelBinder初始化MyModel的新实例并设置MyModelID。所以现在验证了MyModel的所有属性,并为其他2个属性添加了错误。

规则1:编辑数据时始终使用view models。在你的情况下它应该是

public class MydatabaseVM
{
    public int MyModelID { get; set; }
    public virtual Tab2 tab2 { get; set; }  
}

并在视图中

@Html.HiddenFor( m=> m.MyModelID )