【问题标题】:ModelState.IsValid is false due to hidden id field由于隐藏的 id 字段,ModelState.IsValid 为 false
【发布时间】:2016-03-03 14:16:44
【问题描述】:

ModelState.Isvalid 总是显示为假。

我有以下型号

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; }
}

我有这个视图模型

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。

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

【问题讨论】:

  • 我认为你有一个错字。您已将 myMode 声明为 MyModel 类型,但是,您正在引用 model.MyModel。如果 MydatabaseWM 是该视图的模型,那么这是一个无效的引用。
  • 检查ModelState.Errors 看看有什么问题
  • @haim:error 与 id 有关。 id 需要从数据库中自动生成。如果模型状态有效,我应该去保存记录,那么只有我可以获得 ID。
  • @Irb.: MydatabaseWM 是视图的模型。你能告诉我这是什么错误
  • 您的MyModelIDint 类型,因此它会自动触发Required 属性。您的模型绑定器可能没有绑定 model.MyModel.MyModelID,因此它会将 null 发送到您的 POST 操作

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


【解决方案1】:

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

当您删除隐藏输入时,DefaultModelBinder 会初始化 MydatabaseVM 的新实例,但 myMode 的值是默认值 (null),因此无需验证。

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

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

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

在视图中

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

【讨论】:

  • 谢谢斯蒂芬。我为姓氏和名字提供价值。如果是我隐藏的 id,它会失败。清除提供的模型绑定器解释。谢谢。我的视图模型我想包含公共 MyModel myMode { get;放; } 类也
  • 您是说您的视图中有 MyModel.ForenameMyModel.Surname 的隐藏输入吗?
  • 您的意思是为每个选项卡维护多个视图模型。 ?
  • 不。我提供姓氏和名字的值。 ..如果我查看模型状态错误,它会为 MyModel 类中的 MyModelID 给出错误
  • 请再仔细阅读我的回答。如果您有 MyModel.MyModelID 的隐藏输入,并且您不包括 MyModel.ForenameMyModel.Surname 的隐藏输入,则 ModelState 无效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2019-05-20
  • 2012-11-26
  • 2019-05-27
  • 2010-12-19
相关资源
最近更新 更多