2012-01-31 6 views
6

Tengo un int? ver la propiedad del modelo validada en el lado del cliente como si fuera necesaria. Es decir, si dejo el campo en blanco, no se enviará. Lo mismo no sucede con las propiedades de la cadena.¿Por qué mi int? valor siendo validado como si fuera requerido?

El HTML representado por mi editor es:

<input type="text" value="" name="StatusIdSearch" id="StatusIdSearch" data-val-number="The field Status must be a number." data-val="true" class="text-box single-line"> 

creo que data-val-number está causando un error porque nada no es un número, pero no puede determinar por qué.

¿Alguna idea?

Editar

La vista-modelo:

public class CompromissoSearchModel 
{ 
     // other properties removed for the sake of clarity 

     [Display(Name = "Status")] 
     [EnumDataType(typeof(StatusCompromisso))] 
     public int? StatusIdSearch { get; set; } 

     // other properties removed for the sake of clarity 
} 
+4

Muéstranos tu modelo. –

+0

@SergioTapia: gracias por echarle un vistazo. Actualicé la pregunta –

+1

¿La respuesta aquí es: http://stackoverflow.com/questions/4700172/unrequired-property-keeps-getting-data-val-required-attribute help? – hvd

Respuesta

1

usted debería ser capaz de añadir el siguiente código a su método de Application_Start en el archivo Global.asax para solucionar este problema:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

+0

Gracias Scott, pero esto hará que los tipos de valores que no aceptan nulos acepten valores nulos del cliente. –

+0

. Encuentro que este comportamiento para los tipos de valor anulables es intuitivo en los contadores. –

3

El mensaje que está viendo no está relacionado con un campo requerido validat ion. Obtiene esto porque ClientDataTypeModelValidatorProvider agrega validación numérica del cliente e ignora si el tipo es anulable o no. Puede check the code yourself:

private static IEnumerable<ModelValidator> GetValidatorsImpl(
    ModelMetadata metadata, 
    ControllerContext context) 
{ 
    Type type = metadata.RealModelType; 
    if (IsNumericType(type)) { 
     yield return new NumericModelValidator(metadata, context); 
    } 
} 

Y el IsNumericType aplicación:

private static bool IsNumericType(Type type) 
{ 
    // strip off the Nullable<> 
    Type underlyingType = Nullable.GetUnderlyingType(type); 
    return _numericTypes.Contains(underlyingType ?? type); 
} 

Desde el anulable no se considera siempre obtener la certificación. En términos de solución, debe eliminar ClientDataTypeModelValidatorProvider de los proveedores usados ​​o quizás reemplazarlo por uno personalizado que no ignore las opciones de nulos.

+0

angelo: todavía estoy analizando su respuesta. Es extraño porque acabo de crear un nuevo proyecto MVC y int? las propiedades no se validan según sea necesario mientras que las propiedades [Requerido] sí lo son. Hay algo raro con este proyecto en particular, ya que parece que no es el comportamiento esperado. –

0

Estaba teniendo exactamente el mismo problema y logré encontrar una solución. Ninguna de estas soluciones funcionó para mí, así que pensé en publicar mi solución para cualquier otra persona que tenga este problema.

El problema no era que el archivador modelo estuviera validando el campo como no válido, sino que al usar TryUpdateModel, la propiedad que aceptaba nulos el modelo de vista no podía contener nulos en la entidad de base de datos.

explicación más clara:

TryUpdateModel(dbUser, "", new[]{ 
    "DecimalProperty" 
})); 

"DecimalProperty" en el modelo de vista era anulable, pero no era anulable en dbUser.

Cuestiones relacionadas