MVC 3 jQuery Validação / globalização do campo número / decimal

Ao usar globalization culture = “da-DK” no arquivo Web.config, a validação do jQuery não funciona.

Na Dinamarca, usamos a notação 19,95 em vez da americana 19.95 quando escrevemos um preço para o produto, e isso me deu um problema que não consigo resolver.

Eu comecei VS2010, novo projeto MVC 3, adicionei um homeController, uma class de produto e uma visualização de edição padrão simples e o erro já está lá.

Classe do produto:

public class Product { public string name { get; set; } public string itemNo { get; set; } public decimal price { get; set; } } 

HomeController:

 public class homeController : Controller { public ActionResult Index() { var product1 = new Product { name = "Testproduct", itemNo = "PRD-151541", price = 19 }; return View(product1); } } 

Exibição de índice:

 @model WebUI.DomainModel.Product   @using (Html.BeginForm()) { @Html.ValidationSummary(true) 
Product
@Html.LabelFor(model => model.name)
@Html.EditorFor(model => model.name) @Html.ValidationMessageFor(model => model.name)
@Html.LabelFor(model => model.itemNo)
@Html.EditorFor(model => model.itemNo) @Html.ValidationMessageFor(model => model.itemNo)
@Html.LabelFor(model => model.price)
@Html.EditorFor(model => model.price) @Html.ValidationMessageFor(model => model.price)

}

O resultado:

Infelizmente não posso enviar uma imagem aqui – então por favor siga este link para ver o resultado: http://sofpt.miximages.com/jquery/mvc3_razor_validation_error.gif

SO – ao executar o site, o campo será definido como 19,00 – que é a definição de cultura correta – mas, ao tentar salvar, a validação falha.

Por favor ajude…

Você poderia experimentar o plugin jQuery Globalization da Microsoft:

      

Plugin foi renomeado e movido, você deve usar Globalize (mar 2012)

    

mais sobre isso no post do blog de Scott Hanselman


Script atualizado para a versão atual de https://github.com/jquery/globalize com suporte a elementos opcionais

 $.validator.methods.number = function (value, element) { return this.optional(element) || !isNaN(Globalize.parseFloat(value)); } $(function () { Globalize.culture('%%culture%%'); }); 

@shatl tem a resposta certa a partir de hoje. Nota para o atributo range você precisará de um hack mostrado abaixo. O código completo para adicionar é mostrado abaixo:

 @section Scripts { @Scripts.Render("~/bundles/jqueryval")    } 

Eu acabei seguindo o conselho no blog de Scott Hanselman sobre esse tópico – você pode ler sobre isso aqui:

http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

Eu tive que fazer algumas alterações para usar Globalize em vez de jQuery Global (agora jQuery Global está morto). Eu escrevi isso no seguinte post no blog, caso seja útil:

http://icanmakethiswork.blogspot.co.uk/2012/09/globalize-and-jquery-validate.html

Apenas para referência futura, o que funcionou para mim foi o seguinte:

Lembre-se de definir a versão adequada do jQuery e a cultura correta, que neste exemplo é dinamarquesa.
Se não pode haver períodos no valor, descomente o comentário.

       

Obrigado por esta página, me salvou um monte de problemas, eu tive que consertar o código globalize como sempre. A cultura sueca não aceita ponto como separador, mas como o parseFloat usa os pontos de análise subjacentes do javasacript, ele será aceito como separador decimal, mas o lado do servidor será rejeitado. Para corrigir isso eu replace o parseFloat como este

 Globalize.orgParaseFloat = Globalize.parseFloat; Globalize.parseFloat = function(value) { var culture = this.findClosestCulture(); var seperatorFound = false; for (var i in culture.numberFormat) { if (culture.numberFormat[i] == ".") { seperatorFound = true; } } if (!seperatorFound) { value = value.replace(".", "NaN"); } return this.orgParaseFloat(value); }; 

Eu abri um ticket no Github, então talvez isso seja corrigido

depois de alguma pesquisa … encontrei uma solução.

Web.config em adicionar

  

Estender class HtmlHelper

 namespace System.Web.Mvc { public static class LocalizationHelper { public static IHtmlString MetaAcceptLanguage(this HtmlHelper html) { var acceptLang = HttpUtility.HtmlAttributeEncode(Thread.CurrentThread.CurrentUICulture.ToString()); return new HtmlString(string.Format("", acceptLang)); } } } 

_Layout.cshtml no final de adicionar

 @Html.MetaAcceptLanguage();  

Depois dessas mudanças, sou capaz de manipular números decimais com meu web gui.

Atenciosamente, Giacomo

Eu sou da Argentina, e eu estou lutando com este problema há muito tempo, usamos “,” como separador decimal, se você escrever “vírgula” validação javascript falhar, mas se você colocar “.”, modelo irá receber um número convertido em inteiro (55,60 será 5560)

Eu resolvi esse problema com esta simples solução:

1ª- Atualizei as bibliotecas de validação do jquery, usando novos endereços de cdn de: http://jqueryvalidation.org/

os links que eu incluí no meu javascript são os seguintes:

     

e se você quiser em um idioma específico (no meu caso espanhol) adicione essa linha também:

  

Substitua ES pelo idioma desejado.

2º- Se você quiser permitir o teclado numérico decimal, você deve replace “.” com “,” para funcionar corretamente, adicione este código à sua página para fazer isso automaticamente:

 $('#txtCurrency').keyup(function () { $('#txtCurrency').val($('#txtCurrency').val().replace(/\./g, ',')); }); 

Presto, problema resolvido.

Tchau.

Nenhum plug-in

Eu acho que a maneira mais fácil de contornar isso sem qualquer plugin é simplesmente sobrescrevendo a validação padrão, assim:

  

Se você olhar o código-fonte de jquery.validate.js , verá que ele apenas testa um regex como o código acima, além de validar se o elemento é opcional:

insira a descrição da imagem aqui