Asp.net mvc 2 ASP.MVC2RTM&x2B;Id属性处的ModelState错误

Asp.net mvc 2 ASP.MVC2RTM&x2B;Id属性处的ModelState错误,asp.net-mvc-2,modelstate,asp.net-mvc-2-validation,Asp.net Mvc 2,Modelstate,Asp.net Mvc 2 Validation,我有以下课程: 公共类组元数据 { [HiddenInput(DisplayValue=false)] 公共int Id{get;set;} [必需] 公共字符串名称{get;set;} } [元数据类型(typeof(GrupoMetadata))] 公共部分类组 { 公共虚拟整数Id{get;set;} 公共虚拟字符串名称{get;set;} } 这一行动: [HttpPost] 公共操作结果编辑(组) { if(ModelState.IsValid) { //保存逻辑 返回操作(“索引”

我有以下课程:

公共类组元数据
{
[HiddenInput(DisplayValue=false)]
公共int Id{get;set;}
[必需]
公共字符串名称{get;set;}
}
[元数据类型(typeof(GrupoMetadata))]
公共部分类组
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
这一行动:

[HttpPost]
公共操作结果编辑(组)
{
if(ModelState.IsValid)
{
//保存逻辑
返回操作(“索引”);
}
返回视图(组);
}
这是我的观点:



但是ModelState总是无效的!正如我所看到的,对于MVC验证0是无效的,但是对于我是有效的。 既然我没有在Id属性中进行任何类型的验证,我该如何修复它

更新: 我不知道如何或为什么,但在我的例子中,将Id重命名为PK解决了这个问题


您知道这是我的逻辑/配置中的一个问题还是一个bug或预期行为吗?

您有一个必填字段,
Id
。它是必需的,因为它不可为null。您必须(1)将其与表单一起提交,或(2)更改您的模型以使
Id
为空,或(3)使用其他类型。

您的问题是您在模型中使用了名为“Id”的属性。尝试使用不同的名称,您将看到它的工作原理。Mvc似乎对此有问题


我遇到了完全相同的问题。

就在
if(ModelState.IsValid)
使用这一行删除Id索引
ModelState.remove(“Id”)
这样,当MVC团队删除此错误时,您只需要删除项目的这一行代码。

我可以确认使用
ModelState.remove(“Id”)删除Id索引
有效

有人能对这个所谓的“错误”给出详细的解释吗

也许微软MVC团队的人可以给出一个解释


使用ADO.NET实体数据模型作为数据源时,没有类似的错误-仅在Linq To SQL上。

另一个原因可能是:


如果您将密钥声明为数字以外的其他类型,例如字符串,则由于默认情况下它无法为您自动生成密钥,您将面临此错误。

视图是否使用该模型?字段名为“Name”?:)@Craig,只是“Id字段是必需的”。@Amadiere Yes view正在使用模型,我有两个字段:Id和名称。@Craig(1)它不能为null,因为它是我的实体pk。(2) 我从我的表单中提交它,值为0(零)。(3) 使用其他类型不是选项。你是对的,为什么我把姓名表Id改成PK会解决这个错误呢?Regardsy您说您正在提交,但错误消息说您没有提交。这一点,再加上当你重新命名它时它能工作,可能意味着你把名字弄错了。用Fiddler或Firebug检查表单数据以确定。谢谢你,我尝试了你的方法,但对于我的项目,我有一个“更干净”的选项。看看我的答案。只是说,3年后,MVC4仍然存在问题。。。感谢您的解决方案,直到在使用MVC 5、数据库优先和实体框架6时出现此问题。但只有在使用ViewModels时才具有。谢谢!您的解决方案仍然有效=-),尽管我要添加。如果viewmodel中存在导致问题的模型,则需要在id前面加上前缀。
ModelState.Remove(“model.ModelId”)