Evite la validación en el campo int MVC3

Tengo el siguiente ViewModel (solo muestra algunas propiedades para facilitar la lectura)

public class Contract{

public string Name {get; set;}

public ContractTerm PrpTerm { get; set; }

}

el modelo PRP Term es algo como esto

public class PrpTerm{

public int Id {get; set;}
public string Name {get; set;}

}

Para las validaciones de mi modelo, estoy usando un archivo XML para inyectar las anotaciones. he puesto el Name propiedad según sea necesario y he dejado ContractTerm sin especificar ninguna validación (es un campo opcional en una lista). Mi opinión es que algo tiene un cuadro de texto para el Nombre y una lista de selección para el plazo del Contrato.

Cuando estoy tratando de ahorrar, obtengo el ModelState.IsValid propiedad como falsa, diciendo que la PRPTerm.Id Se requiere valor. Entiendo que es porque no podemos asignar un valor nulo a un int.

¿Alguien sabe una manera de evitar que esto sea validado?

Intenté usar la anotación Bind(Exclude, pero esto elimina el campo del envío de datos y esto no me permite obtener el valor que el usuario seleccionó (si eso sucedió). No puedo establecer la identificación como anulable en PrpClass La otra opción es establecer el ID de PrpTerm en ViewModel, pero necesito justificar ese cambio con una razón válida.

¿Alguna idea?

preguntado el 03 de mayo de 12 a las 17:05

2 Respuestas

Un implícito [Required] el atributo se aplica a Id ya que es un int que es, por definición, no anulable (a diferencia de int? que es anulable).

Este comportamiento es configurable en MVC usando

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

que por defecto es verdadero.

Puede deshabilitar este comportamiento configurándolo en falso en su Global.asax.cs

Sin embargo, como señala AFinkelstein, parece que el verdadero problema está en su ViewModel. Le sugiero que reconsidere eso, en lugar de desactivar este práctico valor predeterminado de MVC.

Yo sugeriría

public class Contract
{
    public string Name { get; set; }
    public int? PrpTermId { get; set; }
}

Es probablemente lo que realmente quieres. En términos de una 'razón válida' para hacer esto, generalmente se acepta que sus ViewModels a menudo serán diferentes de sus Modelos, ya que el propósito de un ViewModel dado probablemente sea ligeramente diferente al de los Modelos que lo componen.

contestado el 04 de mayo de 12 a las 05:05

No parece que la clase PrpTerm sea apropiada para su modelo de vista dado que no está usando sus propiedades. Todo lo que realmente desea es un PrpTermName establecido en una lista desplegable. Tendría una estructura de clases como

public class Contract
{
    public string Name { get; set; }
    public string PrpTermName { get; set; }
    public SelectList ContractTermList { get; set; }
}

Ahora no necesita preocuparse por la validación de la ID porque no es parte de su modelo de vista.

contestado el 03 de mayo de 12 a las 17:05

En realidad, lo que obtengo de la vista es la identificación seleccionada de esa Lista. Entiendo que tener el nombre o la identificación de ese término en el modelo de vista será la mejor opción, pero aún no puedo encontrar un argumento diferente a "La validación no funciona" :( - pollirrata

El argumento para no incluirlo es que un modelo de vista solo debe contener las propiedades y los modelos de subvista que necesita. En este caso, está intentando vincular una clase de propiedad múltiple mediante una lista desplegable, que por diseño le permite especificar solo una propiedad. Incluir solo una propiedad en su ViewModel correspondiente a la identificación de la lista desplegable que necesita tiene más sentido. Puede obtener la clase PrpTerm (o el equivalente de la clase de dominio) en su controlador, usando esta propiedad después de la publicación. - DMulligan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.