2010-03-31 16 views
7

mam tej klasy:ASP.MVC 2 RTM + ModelState Błąd na właściwość ID

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; } 
} 

a działanie to:

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

    return View(group); 
} 

To mój widok:

<%@ 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> 

Ale ModelState jest zawsze nieważny! Jak widzę, dla walidacji MVC 0 jest nieprawidłowe, ale dla mnie jest poprawne. Jak mogę to naprawić, ponieważ nie wprowadziłem żadnego rodzaju sprawdzania poprawności w właściwości Id?

UPDATE: Nie wiem jak i dlaczego, ale zmiana nazwy ID, w moim przypadku do PK, rozwiązuje ten problem.

Czy wiesz, że jest to problem w mojej logice/konfiguracji lub jest błędem lub oczekiwanym zachowaniem?

+0

Jaki jest błąd? –

+0

Czy widok korzysta z modelu? Czy pole nosi nazwę "Nazwa"? :) – Amadiere

+0

@Craig, tylko "Pole Id jest wymagane." – Zote

Odpowiedz

9

Usuń wskaźnik ind używając tej linii ModelState.Remove("Id") w ten sposób, gdy zespół MVC usunie ten błąd, wystarczy usunąć ten kod linii swoich projektów.

+2

Po prostu powiedzmy, 3 lata później to nadal jest problem z MVC4 ... Dzięki za rozwiązanie – Tallmaris

+2

Nadal mający ten problem podczas korzystania z MVC 5, Database First i Entity Framework 6. Mając tylko przy użyciu ViewModels chociaż. Wielkie dzięki! Twoje rozwiązanie wciąż działa = -) –

+0

Po prostu chciałbym dodać. Jeśli masz model w viewmodel, który jest przyczyną problemu, musisz poprzedzić identyfikator. 'ModelState.Remove (" model.ModelId ");' –

1

Masz wymagane pole, Id. Jest to wymagane, ponieważ jest nie-nullable. Musisz (1) przesłać go za pomocą formularza lub (2) zmienić model, aby unieważnić Id lub (3) użyć innego typu.

+0

@Craig (1) Nie może być wartością null, ponieważ jest to mój pk dla Entity. (2) Przesyłam go z mojego formularza z wartością 0 (zero). (3) Użycie innego typu nie jest opcją. I masz rację, dlaczego rozwiązuje ten błąd, gdy zmieniam nazwę z Id na PK? Pozdrawiam – Zote

+0

Mówisz, że to przesyłasz, ale komunikat o błędzie mówi, że nie. To, plus fakt, że działa po zmianie nazwy, prawdopodobnie oznacza, że ​​nazwa jest błędna. Sprawdź dane formularzy z Fiddler lub Firebug, aby mieć pewność. –

0

Twój problem polega na tym, że używasz w swoim modelu właściwości o nazwie "id". Spróbuj użyć innej nazwy, a zobaczysz, że działa. Mvc wydaje się mieć z tym problem.

Doświadczyłem dokładnie tego samego problemu.

+0

Dziękuję, że spróbowałem, ale dla mojego projektu otrzymałem "czystszą" opcję. Zobacz moją odpowiedź tutaj. – Zote

1

Mogę potwierdzić, że usunięcie indeksu id przy użyciu ModelState.Remove("Id") działa.

Czy ktoś mógłby podać szczegółowe wyjaśnienie tego rzekomego "błędu"?

Może ktoś z zespołu Microsoft MVC mógłby udzielić wyjaśnień?

Nie ma takich błędów podczas korzystania z modelu danych jednostki podmiotu ADO.NET jako źródła danych - tylko w Linq To SQL.

+0

Używam EF z tym zachowaniem ... – Zote

0

Innym powodem może być:

Jeśli zadeklarować swój klucz jako pewnego rodzaju innego niż numer np String, to ponieważ domyślnie nie może automatycznie wygenerować klucze dla Ciebie, będziesz twarz ten błąd.

Powiązane problemy