2011-11-18 25 views
20

que tienen una propiedad DateTime en mi modelo, pero sólo estoy interesado en la pieza del tiempo:¿Cómo puedo evitar que se genere un atributo de validación?

public class MyModel 
{ 
    [Required, DataType.Time] 
    public DateTime Time 
} 

En mi opinión, la salida que me de esta manera:

@Html.EditorFor(model => model.Time) 

Este utiliza para generar el siguiente código hTML en MVC 3:

<input class="text-box single-line" data-val="true" 
    data-val-required="The Time field is required." 
    id="Time" name="Time" type="time" value="" /> 

Ahora estoy tratando esto con MVC 4, y este es el código hTML generado:

<input class="text-box single-line" data-val="true" 
    data-val-date="The field Time must be a date." 
    data-val-required="The Time field is required." 
    id="Time" name="Time" type="time" value="" /> 

Se ha agregado un atributo adicional data-val-date, que da como resultado un error de validación del lado del cliente, porque un tiempo (p. "10:30") no está formateado como una fecha.

Supongo que esto es un error en MVC 4 (I reported it)? Pero hasta que se resuelva, ¿hay alguna forma de evitar que se genere este atributo? O mejor aún, ¿hay alguna manera de permitir que se genere como data-val-time en lugar, por lo que puedo proporcionar mi propio método de validación del lado del cliente para los campos de tiempo?

Respuesta

2

Puedo decir que la mejor opción será escribir su propia función de validación del lado del cliente. De lo contrario, puedes hacer algo de suplantación que no diré que es correcto, pero puede resolver tu problema. Tuve un problema similar con respecto a la validación de MVC en el que quería cambiar el comportamiento de la validación del lado del cliente. Por favor, consulte el enlace

Asp.net MVC3 validation

La idea aquí es agregar manualmente los atributos tales como "data-val-necesario" y "data-val" a su campo de entrada y luego añada el mensaje de validación para ello.

Espero que te ayude de alguna manera.

Editar:

probar esto

Quitar requerido attr campo de modelo

public class MyModel 
{  
    public DateTime Time 
} 

A continuación, añadir atributos a su control como se muestra a continuación

@Html.TextBoxFor(model => model.Time, new Dictionary<string, object> { { "data-val-required", "required" }, { "data-val", "true" }}) 
    @Html.ValidationMessage("Time", "The Time field is required.") 
+0

Gracias por su respuesta, pero esto en realidad no resuelve mi problema ... yo quiero un atributo específico ('data-val-date') * a no ser insertada *, ya que se inserta automáticamente en alguna parte en la tubería MVC. – fretje

+0

@fretje pruebe el código escrito en la sección de edición – pramodtech

4

No es ideal, pero hará el trabajo; el uso de JavaScript en su plantilla maestra para eliminar la validación:

$(document).ready(function(){ 
    $("input[data-val-date]").removeAttr("data-val-date"); 
}); 
1

He intentado fijar el valor del campo de entrada como un objeto de fecha Javascript, que a su vez pasa la validación de la validación discreta.

$("#date-input-field").val(new Date(1,0,1970)); 
$.validator.unobtrusive.parse('#form'); 
var form = $('#form'); 
form.validate(); 

Esto se hace con jQuery 1.7.2, validation.unobtrusive y mvc4.

Espero que esto ayude.

3

Utilice [DataType ("Time")] en lugar de [DataType (DataType.DateTime)].Esto hará que MVC no trate su variable como DateTime, y luego no generará el atributo "data-val-date".

Esencialmente [DataType ("Time")] hace que su variable sea un tipo personalizado. Sin embargo, no puede usar ningún otro nombre de cadena para el tipo personalizado. MVC intenta detectar el tipo subyacente para un tipo personalizado. Solo cuando nombre su tipo personalizado como "Tiempo", abandonará la detección.

1

La mejor manera es establecer ClientValidationEnabled y UnobtrusiveJavaScriptEnabled en false en la clase HtmlHelper.

HtmlHelper.ClientValidationEnabled = false; 
HtmlHelper.UnobtrusiveJavaScriptEnabled = false; 
+0

Tengo esos en mi configuración. Ponerlos en marcha también funcionó. –

+0

Pero prefiero solo establecer en la Vista. –

+1

@VitorCanova como desee señor .. –

Cuestiones relacionadas