La propiedad no requerida sigue obteniendo el atributo de validación de datos requeridos

Este es el modelo con su validación:

[MetadataType(typeof(TagValidation))] public partial class Tag { } public class TagValidation { [Editable(false)] [HiddenInput(DisplayValue = false)] public int TagId { get; set; } [Required] [StringLength(20)] [DataType(DataType.Text)] public string Name { get; set; } //... } 

Aquí está la vista:

  

Create

@using (Html.BeginForm()) { @Html.ValidationSummary(true)
Tag
@Html.EditorForModel()

}
@Html.ActionLink("Back to List", "Index")

Y aquí está lo que se renderiza:

 
Tag
...

El problema es que la validación de TagId se genera aunque no se requiere atributo Required en la propiedad TagId. Por eso, ni siquiera puedo aprobar la validación del lado del cliente para crear una nueva etiqueta en db. ¿Qué me estoy perdiendo?

Encontré la respuesta. Solo agregue esto a Application_Start :

 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

Haga que los tipos de valores del modelo de vista se puedan anular. Entonces no serán necesarios por defecto.

Tenga en cuenta también que si coloca el atributo ‘required =’ false ” en html 5 (si establece html 5 en su metaetiqueta de datos), verá ” requerido ” y lo hará necesario. Puede usar dojo-data-props = “required: false”.

La solución de frennky solo eliminó data-val-required pero en mi caso todavía tenía data-val-number y data-val

Tuve que agregar las dos líneas a continuación a Application_Start para deshacerme de todo.

 ModelValidatorProviders.Providers.Clear(); ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider()); 

El problema es que el valor del campo oculto está vacío. Esto no debería suceder si usa un tipo entero. Supongo que la propiedad TagId se define como un tipo anulable en la clase Tag . Por lo tanto, asígnele un valor antes de representar la vista o use un tipo de entero:

 [MetadataType(typeof(TagValidation))] public partial class Tag { public int TagId { get; set; } public string Name { get; set; } } 

para que el campo oculto generado se vea así:

  

Además, normalmente no se debe activar la validación del lado del cliente para este campo oculto.

jquery valida el objective cheking “disabled” atributo html.

 $(function () { $("#TagId").attr("disabled", "disabled") }); 

o usa Nullable.

Espero este código!

Con MVC4 también puedes usar esto:

 @{ Html.EnableClientValidation(false); } @Html.EditorForModel() @{ Html.EnableClientValidation(true); } 

Haga que su modelo o modelo de vista vea los tipos de valores “nullabel”. Esto resolverá su problema. Una cosa importante que elimine el atributo “requerido” de su etiqueta, de lo contrario me tomará “requerido”.

Ejemplo:-

 public class ViewModle { public int? foo{get;set;} } 

Aquí, en el ejemplo foo, es un tipo entero que admite nulos, esto ya no será necesario en mvc.

Espero que esto te ayudará.