MVC 3 jQuery验证/全局化数字/十进制字段

时间:2011-03-04 22:07:08

标签: jquery validation asp.net-mvc-3 globalization culture

在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

所以 - 在运行网站时,该字段将设置为19,00 - 这是正确的文化定义 - 但在尝试保存时,验证失败。

请帮忙......

9 个答案:

答案 0 :(得分:57)

您可以尝试Microsoft的jQuery Globalization plugin

<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 blog post

的详情

答案 1 :(得分:23)

更新了当前版本https://github.com/jquery/globalize的脚本,其中包含可选元素支持

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

$(function () {
    Globalize.culture('%%culture%%');
});

答案 2 :(得分:14)

@shatl截至今天有正确的答案。注意范围属性,您需要下面显示的hack。要添加的完整代码如下所示:

@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>
}

答案 3 :(得分:1)

我最后听了Scott Hanselman关于这个主题的博客的建议 - 你可以在这里阅读:

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

我不得不做一些改变来使用Globalize而不是jQuery Global(现在jQuery Global已经死了)。我在以下博文中写了这篇文章,以防有用:

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

答案 4 :(得分:1)

仅供将来参考,对我有用的是:

请记住设置正确的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>

答案 5 :(得分:0)

感谢这个页面,给我带来了很多麻烦,我不得不修复全球化代码。瑞典文化不接受dot作为分隔符,但由于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开了一张票,所以可能会修复

答案 6 :(得分:0)

经过一些研究......我找到了解决方案。

<强>的Web.config <system.web>添加

<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操作十进制数字。

此致 贾科莫

答案 7 :(得分:0)

我来自阿根廷,而且我很久以前就在与这个问题作斗争,我们使用“,”作为小数点分隔符,如果你写“逗号”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。

第二 - 如果要允许数字小键盘十进制,则必须替换“。”使用“,”正常工作,将此代码添加到您的页面以自动执行此操作:

$('#txtCurrency').keyup(function () {

    $('#txtCurrency').val($('#txtCurrency').val().replace(/\./g, ','));

});

Presto,问题解决了。

再见。

答案 8 :(得分:0)

没有插件

我认为解决这个没有任何插件的最简单方法就是覆盖默认验证,如下所示:

<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的源代码,你会发现它只是像上面的代码那样测试一个正则表达式,而且它会验证该元素是否是可选的:

enter image description here