2010-03-31 8 views
7

tengo esta clases:ASP.MVC 2 RTM + ModelState error al ID de propiedad

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

y esta acción:

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

    return View(group); 
} 

Ese es mi punto de vista:

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

Pero ModelState siempre es inválido! Como puedo ver, para la validación de MVC 0 no es válido, pero para mí es válido. ¿Cómo puedo solucionarlo ya que no puse ningún tipo de validación en la propiedad Id?

ACTUALIZACIÓN: No sé cómo o por qué, pero el cambio de nombre Id, en mi caso a PK, resuelve este problema.

¿Sabes si esto es un problema en mi lógica/configuración o es un error o comportamiento esperado?

+0

¿Cuál es el error? –

+0

¿Las vistas usan el modelo? ¿El campo se llama "Nombre"? :) – Amadiere

+0

@Craig, solo "El campo Id es obligatorio". – Zote

Respuesta

9

Antes de if (ModelState.IsValid), quite el índice Id usando esta línea ModelState.Remove("Id") de esta manera, cuando el equipo de MVC elimine este error, solo necesita eliminar este código de línea de sus proyectos.

+2

Solo por decirlo, 3 años después, sigue siendo un problema con MVC4 ... Gracias por la solución – Tallmaris

+2

Todavía tiene este problema cuando se usa MVC 5, Database First y Entity Framework 6. Sin embargo, al usar ViewModels. ¡Muchas gracias! Tu solución aún funciona = -) –

+0

Solo quiero agregar. Si tienes un modelo en el modelo de vista que está causando el problema, debes ponerle un prefijo. 'ModelState.Remove (" model.ModelId ");' –

1

Tiene un campo obligatorio, Id. Es obligatorio porque no admite nulos. Debe (1) enviarlo con su formulario o (2) cambiar su modelo para que se pueda anotar Id o (3) usar un tipo diferente.

+0

@Craig (1) No se puede anular dado que es mi pk para Entity. (2) Lo estoy enviando desde mi formulario con valor 0 (cero). (3) Usar otro tipo no es una opción. Y tienes razón, ¿por qué resuelve el error cuando cambio el nombre del formulario Id a PK? Saludos – Zote

+0

Usted dice que lo está enviando, pero el mensaje de error dice que no. Eso, más el hecho de que funciona cuando cambias el nombre, probablemente significa que tienes el nombre equivocado. Verifique los datos del formulario con Fiddler o Firebug para estar seguro. –

0

Su problema es que está utilizando una propiedad llamada 'id' en su modelo. Intenta usar un nombre diferente y verás que funciona. Mvc parece tener un problema con eso.

Experimenté exactamente el mismo problema.

+0

Gracias, intenté su camino, pero para mi proyecto, obtuve una opción "más limpia". Vea mi respuesta aquí. – Zote

1

Puedo confirmar que la eliminación del índice de id con ModelState.Remove("Id") funciona.

¿Alguien podría dar una explicación elaborada para este presunto "error"?

Tal vez alguien del Equipo de Microsoft MVC podría dar una explicación?

No hay errores como este cuando se utiliza el Modelo de datos de entidades ADO.NET como fuente de datos, solo en Linq To SQL.

+0

Estoy usando EF con este comportamiento ... – Zote

0

Otra razón puede ser:

Si se declara como su clave de algún tipo que no sea un número, por ejemplo cadena, a continuación, ya que por defecto no puede auto generar las claves para usted, usted se enfrentan este error.

Cuestiones relacionadas