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

MVC 3 jQuery验证/数字全球化/十进制字段,jquery,validation,asp.net-mvc-3,globalization,culture,Jquery,Validation,Asp.net Mvc 3,Globalization,Culture,在Web.config文件中使用globalization culture=“da DK”时,jQuery验证不起作用 在丹麦,当我们写at产品的价格时,我们使用符号19,95而不是美国方式19.95,这给了我一个我无法解决的问题 我已经启动了新的MVC3项目VS2010,添加了一个homeController、一个产品类和一个简单的标准编辑视图,错误已经出现了 产品类别: public class Product { public string name { get; set; }

在Web.config文件中使用globalization culture=“da DK”时,jQuery验证不起作用

在丹麦,当我们写at产品的价格时,我们使用符号19,95而不是美国方式19.95,这给了我一个我无法解决的问题

我已经启动了新的MVC3项目VS2010,添加了一个homeController、一个产品类和一个简单的标准编辑视图,错误已经出现了

产品类别:

public class Product
{
    public string name { get; set; }
    public string itemNo { get; set; }
    public decimal price { get; set; }
}
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>
}
家庭控制器:

public class Product
{
    public string name { get; set; }
    public string itemNo { get; set; }
    public decimal price { get; set; }
}
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>
}
索引视图:

public class Product
{
    public string name { get; set; }
    public string itemNo { get; set; }
    public decimal price { get; set; }
}
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>
}
@model WebUI.DomainModel.Product
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
产品
@LabelFor(model=>model.name)
@EditorFor(model=>model.name)
@Html.ValidationMessageFor(model=>model.name)
@LabelFor(model=>model.itemNo)
@EditorFor(model=>model.itemNo)
@Html.ValidationMessageFor(model=>model.itemNo)
@LabelFor(model=>model.price)
@EditorFor(model=>model.price)
@Html.ValidationMessageFor(model=>model.price)

}
结果是:

不幸的是,我无法在此提交图像-因此请按照此链接查看结果:

因此,在运行网站时,字段将设置为19,00,这是正确的区域性定义,但在尝试保存时,验证失败

请帮助…

您可以从Microsoft尝试:

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

$.validator.methods.number=函数(值,元素){
return!isNaN($.parseFloat(value));
}
$(函数(){
$.preferCulture('da-DK');
});

插件被重命名并移动,您应该使用(2012年3月)


$.validator.methods.number=函数(值,元素){
return!isNaN(Globalize.parseFloat(value));
}
$(文档).ready(函数(){
全球化。文化(“da-DK”);
});
更多关于这个



更新了当前版本的脚本,支持可选元素

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

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

感谢这一页,省去了我很多麻烦,我不得不修复全球化代码。瑞典文化不接受点作为分隔符,但由于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开了一张票,所以也许这会在一些研究之后得到解决。。。我找到了解决办法

Web.config
中添加

<globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>
@Html.MetaAcceptLanguage();
<script type="text/javascript">
    $(document).ready(function () {
        var data = $("meta[name='accept-language']").attr("content");
        $.global.preferCulture(data);
    });
</script>

扩展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));
        }
    }
}
namespace System.Web.Mvc
{
公共静态类本地化助手
{
公共静态IHtmlString MetaAcceptLanguage(此HtmlHelper html)
{
var acceptLang=HttpUtility.htmlAttributeNCode(Thread.CurrentThread.CurrentUICulture.ToString());
返回新的HtmlString(string.Format(“,acceptLang));
}
}
}
\u Layout.cshtml
的末尾添加

<globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>
@Html.MetaAcceptLanguage();
<script type="text/javascript">
    $(document).ready(function () {
        var data = $("meta[name='accept-language']").attr("content");
        $.global.preferCulture(data);
    });
</script>
@Html.MetaAcceptLanguage();
$(文档).ready(函数(){
var data=$(“meta[name='accept-language']”)attr(“content”);
$.global.preferCulture(数据);
});
在这些更改之后,我能够用我的web gui处理十进制数字

问候,,
贾科莫

@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>
}
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
$.validator.methods.number=函数(值,元素){
返回此值。可选(元素)||
!isNaN(Globalize.parseFloat(value));
}
$(文档).ready(函数(){
全球化。文化(“fr-fr”);
});
extend(jQuery.validator.methods,{
范围:函数(值、元素、参数){
//使用全球化插件解析值
var val=$.global.parseFloat(值);
返回此。可选(元素)||(

val>=param[0]&&val我最终遵循了Scott Hanselman博客中关于此主题的建议-您可以在此处阅读:

为了使用Globalize而不是jQuery Global(现在jQuery Global已经死了),我做了一些更改。我在下面的博文中写下了这一点,以防有所帮助:


仅供将来参考,对我有效的方法如下:

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

$.validator.methods.number=函数(值,元素){
//if(value.indexOf(“.”>=0){
//返回false;
// }
返回(Globalize.parseFloat(value));
}
$(文档).ready(函数(){
全球化。文化(“da-DK”);
});
extend(jQuery.validator.methods{
范围:函数(值、元素、参数){
//使用全球化插件解析值
var val=Globalize.parseFloat(值);

返回这个。可选(元素)| |(val>=param[0]&&val我来自阿根廷,很久以前我一直在解决这个问题,我们使用“,”作为十进制分隔符,如果您编写“逗号”,javascript验证失败,但如果您输入“,”,模型将接收一个转换为整数的数字(55.60将是5560)

我用这个简单的解决方案解决了这个问题:

1st-我使用新的cdn add升级了jquery验证库