代码之家  ›  专栏  ›  技术社区  ›  Zote

ASP.MVC 2 RTM+ModelState Id属性错误

  •  7
  • Zote  · 技术社区  · 14 年前

    我有以下课程:

    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,解决了这个问题。

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

    5 回复  |  直到 9 年前
        1
  •  9
  •   Zote    14 年前

    就在之前 if (ModelState.IsValid) ModelState.Remove("Id") 这样,当MVC团队删除这个bug时,您只需要删除项目的这行代码。

        2
  •  1
  •   Craig Stuntz    14 年前

    你有一个必填字段, Id . 它是必需的,因为它不可为null。您必须(1)随表格提交,或(2)更改您的模型以 身份证件 nullable或(3)使用不同的类型。

        3
  •  1
  •   Miros    14 年前

    我可以确认使用 ModelState.Remove("Id") 作品。

    有谁能对这个所谓的“窃听器”给出详细的解释吗?

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

        4
  •  0
  •   Machine    14 年前

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

    我也经历了同样的问题。

        5
  •  0
  •   Mohsen Afshin    12 年前

    另一个原因可能是:

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

    推荐文章