Saltar al contenido

La validación de MVC/JQuery no acepta comas como separador decimal

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-DEpero 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *