Web.configファイルでグローバリゼーションculture = "da-DK"を使用すると、jQuery検証が機能しません。
デンマークでは、製品の価格を書くときに米国の方法19.95の代わりに表記19,95を使用しますが、それは私に解決できない問題を与えました。
VS2010、新しいMVC 3プロジェクトを開始し、homeController、Productクラス、および単純な標準編集ビューを追加しましたが、エラーは既にそこにあります。
製品クラス:
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);
}
}
インデックスビュー:
@model WebUI.DomainModel.Product
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Product</legend>
<div class="editor-label">
@Html.LabelFor(model => model.name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.name)
@Html.ValidationMessageFor(model => model.name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.itemNo)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.itemNo)
@Html.ValidationMessageFor(model => model.itemNo)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.price)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.price)
@Html.ValidationMessageFor(model => model.price)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
結果:
残念ながら、ここに画像を送信することはできません。そのため、このリンクをたどって結果を確認してください。 http://www.designvision.dk/temp/mvc3_razor_validation_error.gif
SO-Webサイトを実行すると、フィールドは19,00に設定されます-which IS正しいカルチャ定義-しかし、保存しようとすると、検証は失敗します。
助けてください...
Microsoftの jQuery Globalizationプラグイン を試すことができます。
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.glob.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/globinfo/jquery.glob.da-dk.js")" type="text/javascript"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
return !isNaN($.parseFloat(value));
}
$(function () {
$.preferCulture('da-DK');
});
</script>
プラグインの名前が変更されて移動されました。 Globalize (2012年3月)を使用する必要があります
<script src="@Url.Content("~/Scripts/jquery.globalize/globalize.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.globalize/cultures/globalize.culture.da-DK.js")" type="text/javascript"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
return !isNaN(Globalize.parseFloat(value));
}
$(document).ready(function () {
Globalize.culture('da-DK');
});
</script>
これについての詳細は Scott Hanselmanブログ投稿
https://github.com/jquery/globalize の現在のバージョンのスクリプトを更新し、オプションの要素をサポート
$.validator.methods.number = function (value, element) {
return this.optional(element) || !isNaN(Globalize.parseFloat(value));
}
$(function () {
Globalize.culture('%%culture%%');
});
今日の@shatlには正しい答えがあります。範囲属性については、以下に示すハックが必要です。追加する完全なコードを以下に示します。
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script type="text/javascript" src="~/Scripts/globalize.js"></script>
<script type="text/javascript" src="~/Scripts/globalize.culture.fr-FR.js"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseFloat(value));
}
$(document).ready(function () {
Globalize.culture('fr-FR');
});
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = $.global.parseFloat(value);
return this.optional(element) || (
val >= param[0] && val <= param[1]);
}
});
</script>
}
将来の参考のために、私のために働いたのは以下でした:
適切なjQueryバージョンと正しいカルチャを設定することを忘れないでください。この例ではデンマーク語です。
値にピリオドを含めることができない場合は、コメントのコメントを外します。
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.globalize/globalize.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.globalize/cultures/globalize.culture.da-DK.js")"
type="text/javascript"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
// if (value.indexOf(".") >= 0) {
// return false;
// }
return (Globalize.parseFloat(value));
}
$(document).ready(function () {
Globalize.culture('da-DK');
});
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = Globalize.parseFloat(value);
return this.optional(element) || (val >= param[0] && val <= param[1]);
}
});
</script>
最終的に、このトピックに関するScott Hanselmanのブログのアドバイスに従いました。これについては、こちらで読むことができます。
JQuery Globalの代わりにGlobalizeを使用するには、いくつかの変更を行う必要がありました(現在jQuery Globalは廃止されています)。これが役立つ場合に備えて、次のブログ投稿でこれを書きました。
http://icanmakethiswork.blogspot.co.uk/2012/09/globalize-and-jquery-validate.html
プラグインなしでこれを回避する最も簡単な方法は、次のようにデフォルトの検証をオーバーライドすることです。
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
var regex = /^(\d*)(\,\d{1,2})?$/; //99999,99
return regex.test(value);
}
</script>
jquery.validate.js
のソースコードを見ると、上記のコードのような正規表現をテストするだけでなく、要素がオプションであるかどうかを検証することがわかります。
私はアルゼンチン出身で、ずっと前にこの問題と戦っています。「、」を小数点記号として使用します。「コンマ」を書くとJavaScript検証が失敗しますが、「。」を入れるとモデルは受信します整数に変換された数値(55.60は5560になります)
この単純な解決策でこの問題を解決しました:
1st-次からの新しいcdnアドレスを使用して、jquery検証ライブラリをアップグレードしました: http://jqueryvalidation.org/
私のjavascriptに含めたリンクはこれです:
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/additional-methods.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/additional-methods.min.js"></script>
そして、あなたが特定の言語(私の場合はスペイン語)でそれを望むなら、この行も追加します:
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/localization/messages_es.js"></script>
ESを希望の言語に置き換えます。
2nd-テンキーの10進数を許可する場合は、「。」を置き換える必要があります。 「、」を使用して適切に機能するように、次のコードをページに追加して自動的に実行します。
$('#txtCurrency').keyup(function () {
$('#txtCurrency').val($('#txtCurrency').val().replace(/\./g, ','));
});
プレスト、問題は解決しました。
またね.
いくつかの研究の後...私は解決策を見つけました。
Web.config in <system.web>
add
<globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>
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("<meta name=\"accept-language\" content=\"{0}\"/>", acceptLang));
}
}
}
_ Layout.cshtml<head>
の最後に追加
@Html.MetaAcceptLanguage();
<script type="text/javascript">
$(document).ready(function () {
var data = $("meta[name='accept-language']").attr("content");
$.global.preferCulture(data);
});
</script>
これらの変更の後、Web GUIで10進数を操作できるようになりました。
よろしく、ジャコモ
このページをありがとう、トラブルをたくさん助けてくれたので、グローバル化コードを修正しなければなりませんでした。スウェーデンの文化はドットを区切り文字として受け入れませんが、parseFloatが基になるjavasacriptを使用するため、解析ドットは小数点区切り文字として受け入れられますが、サーバー側は拒否されます。これを修正するには、このようにparseFloatをオーバーライドします
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);
};
Githubでチケットを開いたので、これは修正されるでしょう