asp.net-mvc - tutorial - validar correo electronico mvc
La propiedad no requerida sigue obteniendo el atributo de validaciĆ³n de datos requeridos (7)
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:
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Tag</legend>
<div>@Html.EditorForModel()</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Y aquí está lo que se renderiza:
<form action="/Tag/Create" method="post">
<fieldset>
<legend>Tag</legend>
<div><input data-val="true" data-val-number="The field TagId must be a number." data-val-required="The TagId field is required." id="TagId" name="TagId" type="hidden" value="" />
<div class="editor-label"><label for="Name">Name</label></div>
<div class="editor-field"><input class="text-box single-line" data-val="true" data-val-length="The field Name must be a string with a maximum length of 20." data-val-length-max="20" data-val-required="The Name field is required." id="Name" name="Name" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span></div>
...
</fieldset>
</form>
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?
Con MVC4 también puedes usar esto:
@{ Html.EnableClientValidation(false); }
@Html.EditorForModel()
@{ Html.EnableClientValidation(true); }
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í:
<input
data-val="true"
data-val-number="The field TagId must be a number."
data-val-required="The TagId field is required."
id="TagId"
name="TagId"
type="hidden"
value="0"
/>
Además, normalmente no se debe activar la validación del lado del cliente para este campo oculto.
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".
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á.
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());
jquery valida el objetivo cheking "disabled" atributo html.
$(function () {
$("#TagId").attr("disabled", "disabled")
});
o usa Nullable.
Espero este código!