ASP.MVC 2 RTM + ModelState Ошибка в свойстве Id - PullRequest
7 голосов
/ 31 марта 2010

У меня есть эти классы:

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?

UPDATE: Я не знаю, как и почему, но переименование Id, в моем случае, в PK, решает эту проблему.

Знаете ли вы, если это проблема в моей логике / конфигурации или это ошибка или ожидаемое поведение?

Ответы [ 5 ]

9 голосов
/ 31 мая 2010

Непосредственно перед if (ModelState.IsValid) удалить индекс Id с помощью этой строки ModelState.Remove("Id") таким образом, когда команда MVC удалит эту ошибку, вам просто нужно удалить этот код строки ваших проектов.

1 голос
/ 16 ноября 2010

Я могу подтвердить, что удаление индекса с помощью ModelState.Remove("Id") работает.

Может ли кто-нибудь дать подробное объяснение этой предполагаемой "ошибке"?

Может быть, кто-то из команды Microsoft MVC может дать объяснение?

Подобных ошибок нет при использовании модели данных сущности ADO.NET в качестве источника данных - только в Linq To SQL.

1 голос
/ 01 апреля 2010

У вас есть обязательное поле, Id. Это требуется, потому что это не обнуляется. Вы должны (1) отправить ее вместе с вашей формой или (2) изменить модель, чтобы сделать Id обнуляемым, или (3) использовать другой тип.

0 голосов
/ 03 августа 2012

Еще одна причина может быть:

Если вы объявите свой ключ как какой-либо тип, отличный от числа, например, String , то по умолчанию он не может автоматически сгенерировать ключи для вас., вы столкнетесь с этой ошибкой.

0 голосов
/ 28 мая 2010

Ваша проблема в том, что вы используете свойство с именем 'id' в вашей модели. Попробуйте использовать другое имя, и вы увидите, что оно работает. Mvc, похоже, имеет проблемы с этим.

У меня возникла та же проблема.

...