Te traemos la contestación a este asunto, al menos eso pensamos. Si presentas interrogantes dínoslo, que sin dudar
Solución:
Aunque se sugirió que se trata más bien de un problema de jQuery que de un problema de MVC, creo que es un problema de MVC.
No, eso no es correcto. Está viendo un error de validación del lado del cliente porque, de forma predeterminada, jquery.validate.js
(un complemento de terceros independiente no asociado con MicroSoft, que MVC usa para la validación del lado del cliente) valida los números en función del separador decimal que es un .
(punto), no un ,
(coma).
MVC es un código del lado del servidor y no se ejecuta en el navegador. Para realizar la validación del lado del cliente, MVC HtmlHelper
Los métodos que generan controles de formulario representan un conjunto de data-val-*
attributes en el html utilizado para describir la validación a realizar, que a su vez son analizados por el jquery.validate.unobtrusive.js
complemento cuando se carga el DOM, y los usa para agregar reglas al $.validator
.
en el caso de tu double
propiedad agregará un data-val-number
attribute (además de data-val-required
attribute), que agregará el number
regla que se define como
// http://docs.jquery.com/Plugins/Validation/Methods/number
number: function( value, element )
return this.optional(element) ,
donde el separador decimal es un punto y el separador de miles es una coma (presumiblemente porque el complemento se desarrolló en los EE. UU., por lo que usa un formato de EE. UU.).
Debe sobrescribir el comportamiento predeterminado que puede hacer usando complementos como jquery.globalize, o incluyendo el siguiente script (tenga en cuenta que la expresión regular solo intercambia el punto y la coma)
$.validator.methods.number = function (value, element)
Tenga en cuenta que el script anterior debe estar después del jquery.validate.js
script pero no envuelto en $(document).ready()
Lo que lo vincula a MVC para mí es el hecho de que puedo resolver el problema de validación de fecha agregando la línea
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "0:yyyy-MM-dd")]
al modelo
en realidad es tu [DataType(DataType.Date)]
attribute en conjunción con la [DisplayFormat]
attribute que está influyendo en el html que se genera. los [DataType]
attribute genera que a su vez representa el selector de fechas HTML-5 de los navegadores si el navegador lo admite. De acuerdo con las especificaciones, el formato debe ser
yyyy-MM-dd
(formato ISO) de ahí la necesidad de la [DisplayFormat]
attribute así como.
El selector de fecha HTML-5 muestra la fecha en la referencia cultural de los navegadores. La imagen que has mostrado donde está la entrada. 26.1.2018
es porque la cultura de su navegador es de-DE
pero si navego a su sitio, vería 26/1/2018
en la entrada porque mi cultura es en-AU
(australiano), y si un usuario de Estados Unidos navegó a su sitio, vería 1/26/2018
.
La razón por la cual la validación del lado del cliente funciona para la propiedad de fecha es que el jquery.validate.js
El complemento incluye reglas de fecha para el formato de EE. UU. (MM/dd/yyyy
) y formato ISO (yyyy-MM-dd
).
Y si tuvieras que usar @Html.TextBoxFor(m => m.Inbetriebnahmedatum)
(que ignora su [DataType]
y [DisplayFormat]
attributes) y entró 26.1.2018
en la entrada, también verá un error de validación del lado del cliente.
Creo que el problema es el validador jquery que he usado para resolver el error de coma/punto
$.validator.methods.number = function (value, element) /^-?(?:d+
solo trata de jugar con el
Una solución más sólida podría ser envolver los métodos de validación en su propia función que convierte su número separado por comas en uno separado por decimales.
Un truco es usar .call para llamar a la función de validación original como si “esto” fuera el esto original que pensaron los desarrolladores (por ejemplo, usan una función “esto.opcional” para su validación de pasos).
var originalNumber = $.validator.methods.number;
var wrappedNumber = function (value, element)
var fixedValue = parseFloat(value.toString().replace(",", "."));
return originalNumber.call($.validator.prototype, fixedValue, element); // Call function as if "this" is the original caller
;
$.validator.methods.number = wrappedNumber;
Puede hacer que esto funcione para cualquier validador, por ejemplo, la validación de pasos:
var originalStep = $.validator.methods.step;
var wrappedStep = function (value, element, param)
var fixedValue = parseFloat(value.toString().replace(",", "."));
return originalStep.call($.validator.prototype, fixedValue, element, param);
;
$.validator.methods.step = wrappedStep;
Sección de Reseñas y Valoraciones
Nos encantaría que puedieras comunicar este artículo si te fue de ayuda.