vista validar vacios tutorial net mvc modelo framework formulario form controlador campos asp asp.net-mvc asp.net-mvc-2 data-annotations

asp.net-mvc - vacios - validar entity framework



"El campo de Id es obligatorio" mensaje de validaciĆ³n en Crear; Id no configurado en (15)

Acabo de crear un nuevo proyecto MVC2 y agregué 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, eso es

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 de ID?

Esto no debería terminar en ningún mensaje de error. En cambio, se supone que el Id esté configurado por defecto (int) que es 0. Esto funciona para mí. ¿Qué versión de MVC2 estás usando (el RC supongo)?

No me malinterprete: es importante evitar que el identificador se vincule con los archivos del modelo, ya que eso permitiría a un atacante manipular el Id del objeto. No obstante, la carpeta de modelo predeterminada no debe mostrar el comportamiento que describe.

Esto está sucediendo cuando intento crear la entidad usando una acción Crear estilo 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 Crear.

El modelo dice que "se requiere el campo Id", pero no he establecido que sea así. ¿Hay algo automático pasando aquí?

EDITAR - Motivo revelado

La razón del problema es respondida por Brad Wilson a través de Paul Speranza en uno de los comentarios a continuación donde dice (aplaude a Paul):

Está proporcionando un valor para ID, simplemente no sabía que lo era. Está en los datos de ruta de la ruta predeterminada ("{controller} / {action} / {id}"), y su valor predeterminado es la cadena vacía, que no es válida para un int. Use el atributo [Bind] en su parámetro de acción para excluir ID. Mi ruta predeterminada era: new {controller = "Customer", action = "Edit", id = ""} // Parámetros predeterminados

EDITAR - Actualizar la técnica del modelo

De hecho, cambié la forma en que hice esto de nuevo usando TryUpdateModel y la matriz de parámetros de exclusión asociada 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); }


El Id debe enviarse 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 proveniente del cliente o viene con espacio o nulo. 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"/>

Además, cuando restablezco 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


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


Las respuestas anteriores son correctas. De todos modos, cada uno sigue un escenario diferente. Mi solución es la siguiente para el mismo problema. Si su ID es una clave primaria, entonces necesita iniciarla. Quiero decir que cuando está pasando el modelo para ver en el método get, simplemente cree un nuevo objeto antes de él. Establecerá 0 en su ID en lugar de nulo.


Me encontré con este problema con un formulario en el que estaba agregando "objetos" a una lista de forma dinámica. 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 que la ID Nullable :

public int? Id { get; set; }

De esta forma, los elementos existentes tendrán un valor y los nuevos tendrán nulo en su lugar. Buen material.


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

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Lectura adicional :

  • La propiedad no requerida sigue obteniendo el atributo de validación de datos requeridos
  • El campo opcional ASP.NET MVC se trata según sea necesario
  • ¿Por qué se requiere el conjunto de carpetas MVC Model para valores int, long?

Puedes agregar el atributo:

[Bind(Exclude = "Id")]

en el parámetro en método en lugar de la clase, de esa manera en create puedes excluirlo y al editarlo seguirá siendo obligatorio:

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


También enfrenté el mismo problema contigo y ahora ya resolví esto. Con HttpGet debes devolver una Vista que vaciará el modelo. Como

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

Espero que sea útil con usted


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

Gracias


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 tener

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

De esta forma no tengo que especificar explícitamente los atributos de vinculación


Tuve el mismo problema, excepto que tenía tres campos enteros en mi modelo. Me las arreglé para solucionarlo estableciendo todas mis propiedades enteras que se necesitaban erróneamente para ingresar nulos.


Una gran pregunta y respuestas, salvó mi ... detrás. Debo agregar 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 al nivel de acción.

Dado que esta es una lista blanca en lugar de una lista negra. Lista blanca es mejor, más seguro. De esta forma, también resuelve el riesgo de publicar demasiado y de publicar demasiado. Vea la publicación de Brad Wilson .


Verifica en tu vista. Quite si tiene campo hiddenfieldfor id. Esto se usa solo para editar. @ Html.HiddenFor (Modelo => Modelo.ID)


agregar? a int

[Key] [HiddenInput(DisplayValue = false)] public int? ID { get; set; }


[Bind(Exclude = "Id")] public class Hebe { public int Id {get;set;} [Required] public string Message {get; set} }

Por encima, no vincula la Id Property para su modelo al crear