Mensaje de validación" El campo Id es obligatorio " al crear; Id no establecido en [Requerido]


Esto sucede cuando intento crear la entidad usando una acción Create style en Asp.Net MVC 2.

El POCO tiene las siguientes propiedades:

public int Id {get;set;}

[Required]
public string Message {get; set}

En la creación de la entidad, el Id se establece automáticamente, por lo que no es necesario en la acción Create.

El ModelState dice que "El campo Id es obligatorio", pero no he establecido que sea así. Hay algo automático pasando aquí?

EDITAR - Razón revelada

La razón para el problema es contestado por Brad Wilson a través de Paul Speranza en uno de los comentarios a continuación donde dice (aplausos Paul):

Usted está proporcionando un valor para ID, no sabías que lo estabas. Está en los datos de ruta del valor predeterminado route ("{controlador} / {acción} / {id}"), y su valor predeterminado es el vacío string, que no es válido para un int. Utilice el atributo [Bind] en su parámetro de acción para excluir ID. Mi la ruta predeterminada fue: new { controller = "Cliente", acción = "Editar", id = " " } // Parámetros predeterminados

EDITAR-Actualizar la técnica del modelo

En realidad cambié la forma en que lo hice de nuevo usando TryUpdateModel y el array de parámetros exclude asociado con eso.

    [HttpPost]
    public ActionResult Add(Venue collection)
    {
        Venue venue = new Venue();
        if (TryUpdateModel(venue, null, null, new[] { "Id" }))
        {
            _service.Add(venue);
            return RedirectToAction("Index", "Manage");
        }
        return View(collection);
    }
Author: Dan Beaulieu, 2010-01-27

15 answers

Puede agregar el atributo:

 [Bind(Exclude = "Id")] 

En el parámetro en method en lugar de la clase, de esa manera al crear puede excluirlo y al editar seguirá siendo obligatorio:

public ActionResult Create([Bind(Exclude = "Id")] User u)
{
    // will exclude for create
}

public ActionResult Edit(User u)
{
    // will require for edit
}
 82
Author: Rosstified,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-27 04:45:20

Me encontré con este problema con un formulario en el que estaba agregando "objetos" a una lista dinámicamente. Por lo tanto, nuestros usuarios pudieron agregar, eliminar o actualizar. Todo funcionó bien, excepto en los casos en que se crearon nuevos elementos. Por esta razón, en mi caso, excluir la propiedad Id no era una opción. La solución fue hacer el ID Nullable :

public int? Id { get; set; }

De esta manera los elementos existentes tendrán un valor y los nuevos tendrán null en su lugar. Buen material.

 17
Author: Ulises,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-09 23:01:34

Gran pregunta y respuestas, salvó mi ... tras. Necesito añadir algo, sin embargo:

En lugar de

[Bind(Exclude = "Id")]

Creo que es mejor usar

[Bind(Include = "Prop1, Prop2, Prop3, etc")]

.. donde Prop1, Prop2 y Prop3 son LAS ÚNICAS propiedades que desea vincular en el nivel de acción.

Ya que esto es una lista blanca en lugar de una lista negra. La lista blanca es mejor, más segura. De esta manera también se resuelve el riesgo de sobre publicación y bajo publicación también. Ver Brad Wilson post .

 10
Author: Andrei Rînea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-15 08:29:10
[Bind(Exclude = "Id")]
public class Hebe
{
      public int Id {get;set;}

      [Required]
      public string Message {get; set}
}

Por cierto, no enlaza la propiedad Id de su modelo al crear

 6
Author: Barbaros Alp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-26 23:09:29

El Id debe ser enviado desde el cliente como 0. El modelo no tiene un problema con Id = 0, este es el valor predeterminado de int. El problema es que no ve el valor que viene del cliente o que viene con space o null. Tengo una entrada oculta que representa el Id (o en el objeto complejo NestedPropertyId/NestedProperty.Id), así que me aseguro de que comience con un valor de cero.

<input type="hidden" id="id" value="0" />
<input type="hidden" id="eventId" value="0"/>
<input type="hidden" id="contactId" value="0"/>

También cuando Ireset el formulario para Agregar Nueva entidad en el lado del cliente, me aseguro de inicializar el oculto con cero.

Espero que esto ayude a alguien.

Efy

 5
Author: user1911353,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-31 18:00:41

Tengo el mismo problema, usando RC2 con POCO. Si nombra un Id de propiedad pero no le pone atributos de validación, pero isValid dice que es obligatorio. Si nombro una propiedad cualquier cosa menos Id esto no sucede. ¿Por qué debería tener que excluir Id?

Gracias

 2
Author: Paul Speranza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-28 17:00:40

Add ? a int

[Key]
[HiddenInput(DisplayValue = false)]
public int? ID { get; set; }
 2
Author: andreydruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-17 21:58:56

En mi caso, el problema provenía del hecho de que ID era de un tipo string. Cambiar a un int (no se puede anular) lo arregló para mí. El tipo string fue el resultado de la ingeniería inversa de una base de datos mal diseñada.

 1
Author: PBG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 14:42:28

Revisa tu vista. Elimine si tiene el campo hiddenfieldfor id. Esto se usa solo para editar. @HTML.HiddenFor (Modelo = > Model.Id)

 1
Author: Than Aramburo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-01 05:21:26

Acabo de crear un nuevo proyecto MVC2, y he añadido un POCO simple, así como un Controlador y una vista. Por lo que entiendo, estás usando el enlace de modelo para crear el objeto, es decir

using System.ComponentModel.DataAnnotations;
public class SimpleObject
{
    public int Id {get;set;}
    [Required]
    public string Message { get; set; }
}

En el Controlador tenemos

[HttpPost]
public ActionResult Create(SimpleObject created)
{
    /// do something
}

Y en la vista, no hay editor para el campo ID?

Esto no debería terminar en ningún mensaje de error. En su lugar, se supone que el Id se establece en default(int) que es 0. Esto funciona para mí. ¿Qué versión de MVC2 está utilizando (el RC I asumir)?

No me malinterpretes: Es importante evitar que el Id sea enlazado por los encuadernadores del modelo ya que eso permitiría a un atacante manipular el Id del objeto. Sin embargo, el aglutinante de modelo predeterminado no debe mostrar el comportamiento que describe.

 0
Author: mnemosyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-27 07:31:13

Tuve el mismo problema, excepto que tenía tres campos enteros en mi modelo. Me las arreglé para evitarlo estableciendo todas mis propiedades enteras que se requerían erróneamente a ints nullables.

 0
Author: kmehta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-01 14:14:07

Las respuestas anteriores son correctas. Mi solución es la siguiente para el mismo problema. Si su ID es una clave primaria, entonces necesita iniciarlo, quiero decir que cuando está pasando el modelo para ver en el método get, simplemente cree un nuevo objeto antes de él . Se establecerá 0 a su ID en lugar de null.

 0
Author: Geeti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-29 05:23:11

Tuve el mismo problema y logré resolverlo simplemente pasando una instancia vacía del modelo de vista a la vista durante la llamada GET de mi método Create.

//GET: DocumentTypes/{Controller}/Create
    public ActionResult Create()
    {
        return View(new DocumentTypeViewModel());
    }

    //POST: DocumentTypes/{Controller}/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(DocumentTypeViewModel viewModel)
    {
        if(ModelState.IsValid) {

            var result = AddDocumentType(viewModel);
            if(!result.HasValidationErrors) {
                return RedirectToAction("Index");
            }

            ModelState.Update(result);

        }

        return View(viewModel);
    }

Y luego, en mi opinión, me aseguro de que tengo

@Html.HiddenFor(m => m.ID)

De esta manera no tengo que especificar explícitamente atributos de Enlace

 0
Author: jspaey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-08 17:36:34

También me enfrenté al mismo problema con usted y ahora ya he resuelto esto. Con HttpGet necesita devolver una vista vacía del modelo. Tales como

[HttpGet]
public ActionResult Add()
{
    //Your code here
    return View(new Venue);
}

Espero que sea útil con usted.

 0
Author: user3717418,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 04:32:39

Puede desactivar esta validación implícita configurando el AddImplicitRequiredAttributeForValueTypes opción en el DataAnnotationsModelValidatorProvider añadiendo lo siguiente a su Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Otras lecturas :

 0
Author: KyleMit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-05 18:38:14