6

Veo que hay algunas preguntas similares a esto, pero ninguna resuelve mi problema.MVC3 Validación con ComponentModel.DataAnnotations para el formato de fecha del Reino Unido (también usando jquery ui datepicker)

Estoy trabajando en una aplicación MVC3 con Entity Framework 4.3. Tengo un campo de fecha del Reino Unido que planeo permitir que el usuario edite usando el marcador de fecha Jquery UI (que he obtenido gracias al this blog).

Afortunadamente para mí este blog incluye instrucciones para hacer el datepicker usando el formato del Reino Unido, sin embargo, la validación de EF todavía me dice que necesito ingresar un formato de fecha válido. Curiosamente, esto no me impide enviar la fecha al DB; es solo la validación discreta que inicia y muestra el mensaje.

Por el momento tengo la siguiente anotación de datos:

[DataType(DataType.Date)] 
public System.DateTime Module_Date { get; set; } 

pero también he intentado añadir:

[DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")] 

el cual no tuvo ningún efecto en absoluto. Espero que alguien tenga una solución porque no me apetece desactivar la validación discreta para detener este mensaje de error.

Gracias

EDITAR

siguientes @Iridio respuesta, miré en la adición de un modelo de unión, y de hecho a partir de los pocos puestos como este que lo leí parecían ser lo que hay que hacer , pero lo que se me ocurrió no tiene ningún efecto. Esto es lo que he intentado:

public class DateTimeBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture); 

     return date; 
    } 
} 

con esto en el método del archivo Global.asax.csApplication_Start():

ModelBinders.Binders.Add(typeof(DateTime), new DateTimeBinder()); 
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeBinder()); 
+0

Creo que su referencia a System.ComponentModel.DataAnnotations en lugar de las anotaciones de datos EntityFramework? Si siguió el blog, ¿especifica el formato de datos '{dateFormat:" dd/mm/aa "}' en su script del lado del cliente? De ser así, ¿qué versión de la secuencia de comandos de jquery ui está usando? – Dangerous

+0

oooh tienes razón, estoy usando los ComponentModel. Me acostumbré a usar los EF en el último proyecto. actualizará. Estaba usando jquery ui 1.8.7 pero he actualizado a la última según su respuesta a continuación en vano – Ben

+0

oh y sí he especificado '{dateFormat:" dd/mm/aaaa "}' – Ben

Respuesta

4

Correcto, el problema fue que los guiones de validación de jquery insistían en usar el formato de fecha de US. Me abstendré de hacer una farsa sobre el hecho de que la mayoría del mundo usa dd/mm/aaaa sin embargo.

De todos modos, finalmente encontré la respuesta a mis problemas en un comentario a la respuesta de un question similar, el autor de la cual escribió amablemente un blog post sobre cómo resolvió el problema.

Básicamente he usado el jquery globalize script y simplemente configuré el cultivo en en-GB. Debo mencionar que en su blog que no menciona dónde poner el bit donde se especifica la cultura, y por eso sólo empujado adentro en etiquetas script en la página bajo las referencias a los scripts de la globalización:

<script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/globalize.culture.en-GB.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    Globalize.culture("en-GB"); 
    $.validator.methods.date = function (value, element) { 
     return this.optional(element) || Globalize.parseDate(value); 
    }; 
</script> 
+0

¡Realmente no debería ser necesario hacer todo este trabajo solo para hacer que la fecha del Reino Unido valide! Pero gracias por la información que estaba atascado en este caso. Solo espero que jQuery agregue una forma más elegante de hacerlo pronto. Ese script globalize.js (ironically spelled with a z :)) es bastante grande. –

+0

@PaulJohnson Estoy de acuerdo, no debería tener que hacer eso, y de hecho no es una solución muy buena para muchos casos porque siempre obliga a las fechas de formato del Reino Unido. – Ben

+0

He estado buscando dos días para resolver este problema, con el dedo apuntando a JQuery por las razones que mencionas. Esta solución me funcionó a la perfección, aunque la forma más sencilla de implementarla fue usar nuget para agregar el paquete jquery-globalize, y si lo hace, las ubicaciones de los scripts se convertirán en /Scripts/globalize/globalize.js y/Scripts/globalize/culture/globalize.culture.en-GB.js –

1

usted tiene que escribir es el propietario ModelBinder para el tipo DateTime.

Esta es una carpeta que escribí para un problema similar pero con el tipo Decimal (tal vez lo necesite). usted debe captar la idea y adaptarla a sus necesidades

public class DecimalModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    try 
    { 
     actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
    } 
} 

Luego, en global.asax se registra su carpeta y ya está

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    //Here you tell how to hendle the specific type 
    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
} 

ACTUALIZACIÓN

Después de su aclaración this answer debería ayudar

+0

¡respuesta rápida guau! ¡Gracias! Voy a intentarlo. – Ben

+0

intenté un enfoque similar a este, pero no puedo hacerlo funcionar, he actualizado mi pregunta con mi intento – Ben

+0

Actualicé la respuesta para usar globalize en su validación del lado del cliente – Iridio

1

Creo que hay un error en la versión de script de la fecha de jquery ui selector que se envía con el marco mvc3 (jquery-ui-1.8.11.js).

Si especifica la fecha en el formato uk (como de hecho los estados blog):

$(document).ready(function() { 
    $('.date').datepicker({dateFormat: "dd/mm/yy"}); 
}); 

continuación jquery-ui-1.8.11.js parece tener un problema con la validación de la fecha y sigue pidiendo para una fecha válida en el Reino Unido (pero la validación parece aleatoria).Si cambia el formato de fecha a "mm/dd/aa", este problema desaparecerá, pero eso no es bueno para las fechas en el Reino Unido.

El problema se ha resuelto en una versión posterior de esa biblioteca para descargar la última versión (1.8.18 creo que en el momento de la escritura) o la referencia de la CDN:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script> 
+0

Parece que estoy usando una versión ligeramente anterior (1.8.7) tan intercambiado en el nuevo, y no hizo ninguna diferencia. gracias aunque – Ben

0

que he tenido este problema justo ahora, me llevó horas encontrar la razón. No digo que este sea su problema, pero después de haber pasado horas cambiando globalizaciones en todo, etc., pensé en publicar el tema aquí para cualquier persona que tenga problemas como yo.

De todos modos, el problema en mi proyecto en realidad no era lo que yo pensaba que era. Había decorado la propiedad con [DataAnnotationsExtentions.Date], lo que resulta ser un desastre para la validación del lado del cliente en Chrome en lo que respecta a la localización (es decir, si desea un día después del día 12 en Inglaterra) aunque parece funcionar bien en otros navegadores. Tan pronto como lo eliminé, funcionó

1

realidad he encontrado una solución mejor aquí .... por #fretje

Override jquery date

he modificado la/su código ligeramente, aunque por lo que todavía puede tener formatos de fecha así como un 30 de mayo de 2012 a continuación.

$(function() { 
    $.validator.addMethod(
     "date", 
     function (value, element) { 

      //Added to validate dates like 31 May 2012 
      if (value.split('/').length === 1) 
       return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); 

      var bits = value.match(/([0-9]+)/gi), str; 
      if (!bits) 
       return this.optional(element) || false; 
      str = bits[1] + '/' + bits[0] + '/' + bits[2]; 
      return this.optional(element) || !/Invalid|NaN/.test(new Date(str)); 
     }, 
     "Please enter a date in the format dd/mm/yyyy" 
    ); 

    $global.init(); 
}); 
0

El problema es que por alguna razón si se pone una clase llamada "fecha" en su campo respectivo, Chrome acaba de obtener una locura según lo descrito aquí en this blog. Tuve el mismo problema y cambié el nombre de la clase a customDate y se solucionó.

+0

No publique respuestas de solo enlaces –

Cuestiones relacionadas