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 可以解决这个问题。

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

4

5 回答 5

9

就在MVC 团队删除此错误时,if (ModelState.IsValid)使用此行以这种方式删除 Id 索引之前ModelState.Remove("Id"),您只需删除项目的此行代码。

于 2010-05-31T11:34:12.713 回答
1

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

于 2010-03-31T20:57:58.617 回答
1

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

任何人都可以对这个所谓的“错误”给出详细的解释吗?

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

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

于 2010-11-16T10:30:15.587 回答
0

您的问题是您在模型中使用了一个名为“id”的属性。尝试使用不同的名称,您会发现它有效。Mvc 似乎对此有问题。

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

于 2010-05-28T18:44:40.797 回答
0

另一个原因可能是:

如果您将密钥声明为数字以外的其他类型,例如String,那么由于默认情况下它不能为您自动生成密钥,您将面临此错误。

于 2012-08-03T05:18:09.290 回答