mvc example bootstrap jquery asp.net-mvc asp.net-mvc-4 jquery-ui-datepicker

jquery - example - La fecha del campo debe ser una fecha en mvc en chrome



jquery ui datepicker es js (6)

A continuación se muestra el código de trabajo que puede ser útil para que alguien solucione el problema del selector de fecha en Chrome y Safari: Modelo:

public DateTime? StartDate { get; set; }

Ver:

@Html.TextBoxFor(model => model.StartDate, "{0:dd/MM/yyyy}", new { @type = "text", @class = "fromDate" })

js:

$(function () { checkSupportForInputTypeDate(); $(''#StartDate'').datepicker({ changeMonth: true, changeYear: true, dateFormat: ''dd/mm/yy'' }); }); //Function to configure date format as the native date type from chrome and safari browsers is clashed with jQuery ui date picker. function checkSupportForInputTypeDate() { jQuery.validator.methods.date = function (value, element) { var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor); if (isSafari || isChrome) { var d = new Date(); return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value))); } else { return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); } }; }

Esta pregunta ya tiene una respuesta aquí:

Estoy haciendo una simple aplicación de Internet MVC4, que permite agregar algunos elementos a las categorías.

Esto es lo que hice hasta ahora.

Tengo un marcador de fecha en la vista de mvc. El script para datepicker es así.

<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery-ui-1.8.20.min.js")" type="text/javascript"></script> @Scripts.Render("~/bundles/jqueryval") <script type="text/javascript"> $(function () { $(''#dtItemDueDate'').datepicker({ dateFormat: ''dd/mm/yy'', minDate: 0 }); }); </script>

La propiedad de mi modelo:

[DisplayName("Item DueDate")] [Required] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",ApplyFormatInEditMode = true)] [DataType(DataType.DateTime)] public DateTime? dtItemDueDate { get; set; } public char charCompleted { get; set; }

y en mi opinión, he hecho esto:

@Html.TextBoxFor(m => m.dtItemDueDate) @Html.ValidationMessageFor(m => m.dtItemDueDate)

El error es así:

The field Item DueDate must be a date.

Lo extraño es que funciona en IE y en mozilla, pero no funciona en Chrome.

Encontré muchas publicaciones en SO, pero ninguna de ellas ayuda

¿Alguna idea / sugerencia?


Aquí está la solución de Maxim Gershkovich explicada un poco más:

jQuery.validator.methods.date = function (value, element) { if (value) { try { $.datepicker.parseDate(''dd/mm/yy'', value); } catch (ex) { return false; } } return true; };

Notas :

  • Esto depende del método jQuery datepicker que viene con jQuery UI
  • Esto es realmente más robusto que la validación de fecha nativa que viene con jQueryValidate.

    De acuerdo con la documentación de la fecha de validación :

    Devuelve verdadero si el valor es una fecha válida. Utiliza la fecha incorporada de JavaScript para comprobar si la fecha es válida y, por lo tanto , no realiza verificaciones de cordura . Solo el formato debe ser válido, no la fecha real, por ejemplo 30/30/2008 es una fecha válida.

    Mientras que parseDate verificará que la fecha sea válida y que realmente exista.


La solución Rowan Freeman no funcionará para mí, ya que .toLocaleDateString(value) no analiza las cadenas de value

aquí está la solución que se me ocurrió => en jquery.validate.js encontrar esta definición de función: "fecha: función (valor, elemento)" y reemplazar el código con:

// http://docs.jquery.com/Plugins/Validation/Methods/date date: function (value, element) { var d = value.split("/"); return this.optional(element) || !/Invalid|NaN/.test(new Date((/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())) ? d[1] + "/" + d[0] + "/" + d[2] : value)); },


Resolví este problema cambiando de DateTime a String .

Esta es la mejor solución para un buen mantenimiento que puedo pensar en este momento.


Sin cambiar jquery.validate.js, puede usar el fragmento de código siguiente en $(document).ready() :

jQuery.validator.methods.date = function (value, element) { var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); if (isChrome) { var d = new Date(); return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value))); } else { return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); } };


Nota del editor: esta respuesta ya no es válida, a partir de jQuery 1.9 (2013) se $.browser método $.browser

De acuerdo con este post , es un capricho conocido con navegadores basados ​​en Webkit.

Una solución es modificar jquery.validate.js encontrando la función date: function (value, element) y poner este código en él:

if ($.browser.webkit) { //ES - Chrome does not use the locale when new Date objects instantiated: var d = new Date(); return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value))); } else { return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); }