2010-03-31 10 views
7

ho questo classi:ASP.MVC 2 RTM + ModelState errore a ID proprietà

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

e questa azione:

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

    return View(group); 
} 

Questa è la mia visione:

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

Ma ModelState è sempre invalido! Come posso vedere, per la convalida MVC 0 non è valido, ma per me è valido. Come posso risolvere da quando, non ho inserito alcun tipo di validazione nella proprietà Id?

UPDATE: Non so come o perché, ma rinomina Id, nel mio caso per PK, risolve questo problema.

Sai se questo è un problema nella mia logica/configurazione o è un bug o un comportamento previsto?

+0

Qual è l'errore? –

+0

La vista sta usando il modello? Il campo è chiamato "Nome"? :) – Amadiere

+0

@Craig, solo "Il campo Id è richiesto." – Zote

risposta

9

Poco prima dello if (ModelState.IsValid) rimuovere l'indice di identificazione utilizzando questa riga ModelState.Remove("Id") in questo modo quando il team MVC rimuove questo errore, è sufficiente rimuovere questo codice di linea dei progetti.

+2

Solo per dire, a 3 anni di distanza questo è ancora un problema con MVC4 ... Grazie per la soluzione – Tallmaris

+2

Abbiamo ancora questo problema quando si utilizza MVC 5, Database First e Entity Framework 6. Avendo solo quando si utilizza ViewModels però. Molte grazie! La tua soluzione funziona ancora = -) –

+0

Anche se vorrei aggiungere. Se hai un modello nel viewmodel che sta causando il problema, devi prefisso l'id. 'ModelState.Remove (" model.ModelId ");' –

1

Hai un campo obbligatorio, Id. È richiesto perché non è annullabile. È necessario (1) inviarlo con il modulo o (2) modificare il modello per rendere nullo Id o (3) utilizzare un tipo diverso.

+0

@Craig (1) Non può essere nullo poiché è il mio pk per Entity. (2) Lo sto inviando dal mio modulo con valore 0 (zero). (3) Utilizzare un altro tipo non è un'opzione. E hai ragione, perché risolve l'errore quando cambio ID nome modulo in PK? Cordiali saluti – Zote

+0

Hai detto che lo stai inviando, ma il messaggio di errore dice che non lo sei. Questo, oltre al fatto che funziona quando lo si rinomina, probabilmente significa che hai sbagliato il nome. Controlla i dati del modulo con Fiddler o Firebug per essere sicuro. –

0

Il tuo problema è che stai usando una proprietà chiamata 'id' nel tuo modello. Prova ad usare un nome diverso e vedrai che funziona. Mvc sembra avere un problema con quello.

Ho riscontrato lo stesso identico problema.

+0

Grazie, ho provato a modo tuo, ma per il mio progetto ho avuto un'opzione "più pulita". Vedi la mia risposta qui. – Zote

1

Posso confermare che la rimozione dell'indice ID utilizzando ModelState.Remove("Id") funziona.

Qualcuno potrebbe dare un'elaborata spiegazione per questo presunto "insetto"?

Forse qualcuno del team Microsoft MVC potrebbe fornire una spiegazione?

Non ci sono errori come questo quando si utilizza il modello di dati di entità ADO.NET come origine dati - solo su Linq To SQL.

+0

Sto usando EF con questo comportamento ... – Zote

0

Un altro motivo può essere:

Se dichiarate la vostra chiave come alcuni tipo diverso da un numero ad esempio String, poi dato per difetto che non può generare automaticamente le chiavi per te, ti faccia questo errore

Problemi correlati