ASP.MVC 2 RTM + ModelState Error at Id property

7

我有这些类:

public class GroupMetadata
{
    [HiddenInput(DisplayValue = false)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
}

[MetadataType(typeof(GrupoMetadata))]
public partial class Group
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

同时,这个操作:

[HttpPost]
public ActionResult Edit(Group group)
{
    if (ModelState.IsValid)
    {
        // Logic to save
        return RedirectToAction("Index");
    }

    return View(group);
}

那是我的观点:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Group>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm()) {%>
        <fieldset>
            <%= Html.EditorForModel() %>
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    <% } %>
    <div>
        <%=Html.ActionLink("Back", "Index") %>
    </div>
</asp:Content>

但是ModelState始终无效!我可以看到,对于MVC验证,0是无效的,但对我来说是有效的。我没有在Id属性中放置任何验证,该如何修复呢?

更新: 我不知道为什么,但将Id重命名(在我的情况下重命名为PK)可以解决这个问题。

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


视图是否使用了模型?字段名叫做“Name”吗? :) - Amadiere
@Craig,只是“Id字段是必需的”。 - Zote
@Amadiere 是的,视图使用模型,我有两个字段:Id和Name。 - Zote
5个回答

9

if (ModelState.IsValid)之前,使用此行ModelState.Remove("Id")删除Id索引,这样当MVC团队修复该错误时,您只需要从项目中删除此代码行。


2
只是说,三年后,MVC4仍然存在这个问题...感谢您提供的解决方案。 - Tallmaris
2
在使用MVC 5、Database First和Entity Framework 6时,仍然存在此问题。但只有在使用ViewModels时才会出现。非常感谢!您的解决方案仍然有效 =-) - Rafael Merlin
只是想补充一下。如果您在视图模型中有一个导致问题的模型,您需要添加前缀id。 ModelState.Remove("model.ModelId"); - user1752532

1

您有一个必填字段,Id。它是必填的,因为它是非空的。您必须执行以下操作之一:(1)将其与表单一起提交,或者(2)更改您的模型以使Id可为空,或者(3)使用不同的类型。


@Craig(1)它不能为nullble,因为它是实体的主键。 (2)我从我的表单中提交它,值为0(零)。 (3)使用另一种类型不是选项。而且你是对的,当我将名称表单ID更改为PK时,为什么会解决错误?问候 - Zote
你说你已经提交了,但错误信息显示你没有。再加上当你重命名后它可以工作,很可能是你的名称写错了。使用Fiddler或Firebug检查表单数据以确保正确。 - Craig Stuntz

1

我可以确认使用ModelState.Remove("Id")移除ID索引是可行的。

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

也许微软MVC团队中的某个人能够做出解释?

当使用ADO.NET实体数据模型作为数据源时,不会出现这样的错误 - 只有在Linq To SQL中才会出现。


0
你的问题在于你的模型中使用了一个名为'id'的属性。尝试使用不同的名称,你会发现它可以工作。Mvc似乎有这个问题。
我也遇到了完全相同的问题。

谢谢,我尝试了你的方法,但对于我的项目,我找到了一个更“简洁”的选项。请看我在这里的回答。 - Zote

0
另一个可能的原因是:
如果您将密钥声明为除数字之外的某种类型,例如 String,则由于默认情况下它无法自动生成密钥,因此您将面临此错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接