ASP.NET MVC 3 RC 2客户端验证与全球化

11

我的目标是在客户端基于用户的文化背景来验证用户输入。

我有一个基本的数据模型,其结构如下:

public class User
{
 public int UserId { get; set; }

 [Required]
 [StringLength(20,MinimumLength=3)]
 public string Name { get; set; }

 [Required]
 public double Height { get; set; }
}

此外,我希望启用客户端验证,检查是否为有效数字。因此,我在 _Layout.cshtml 的 <head> 部分中添加了以下行。

<script src="@Url.Content("~/Scripts/jQuery-1.4.2.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>

为了能够验证其他语言格式的输入(在这种特定情况下是德语,使用小数点格式0,75,而在美国则是0.75),我已经在之前提到的jquery.validate.min.jsjquery.validate.unobtrusive.min.js之后添加了以下代码行(jQuery Globalization PlugIn)。

<script src="@Url.Content("~/Scripts/jquery.glob.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/globinfo/jquery.glob.de-de.js")" type="text/javascript"></script>
<script type="text/javascript">
 $(document).ready(function () {
  $.culture = jQuery.cultures['de-DE'];
  $.preferCulture($.culture.name);
 });
</script>

另外,我已经在web.config文件的system.web部分中添加了以下行,以确保德国文化始终被选择:

<globalization culture="de-DE" uiCulture="de-DE" />

我现在遇到以下行为:

  • 如果我在“高度”值的文本框中输入0,1(请注意德国拼写方式),则会出现验证错误消息高度必须是数字,我将无法提交表单。
  • 如果我输入0.1(英式拼写),我可以提交表单,但服务器端验证返回以下验证错误消息:值“0.1”对于高度无效。

所以现在我陷入了某种死结,无法解决。

再次说明,我的目标是基于用户的区域设置(在这种情况下强制为德国语言)在客户端和服务器端验证小数输入。我做错了什么?

非常感谢您的帮助!提前致谢!

2个回答

8
很不幸,jQuery.validate.format和jQuery.Globalization.format函数之间存在名称冲突。因此,您需要更改代码以使用非jQuery全球化插件。 我刚刚写了一篇关于此的博客文章here。 对于您来说,应该像这样:
<script src="@Url.Content("~/Scripts/globalization.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/globinfo/Globalization.de-DE.js")" type="text/javascript"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
    if (!isNaN(Globalization.parseFloat(value))) {
        return true;
    }
    return false;
}
$(document).ready(function () {
    $.culture = jQuery.cultures['de-DE'];
    $.preferCulture($.culture.name);
    Globalization.preferCulture($.culture.name);
});
</script>

那应该足够了。


你的 if 错误地将 0 识别为无效值;请使用 return !isNaN(Globalization.parseFloat(value)); 作为函数体。 - Klemen Slavič
你通知了插件的创建者吗?如果还没有,请做一下。 我遇到了和"sde"同样的问题,但是我不想用非官方或覆盖的方法去"黑客"解决。 - toebens
好的,你刚刚帮我省了很多代码查找的时间 - 你真是个明星,非常感谢你的博客文章并在SO上分享! - Dav
如果我想验证0.1和0,1两个值,该怎么做呢? - Matthias
如果您想要验证两者,只需在验证函数中编写自己的代码即可。我想您可以使用全球化插件来验证特定的文化 - 只需查看一下即可。 - Maksymilian Majer

1

我不得不禁用UnobtrusiveJavaScript。页面不再立即响应,但至少它能正常工作。

你可以在Web.Config中默认禁用它。

<appSettings>
    <add key="enableSimpleMembership" value="false"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="false"/>
 </appSettings>

我使用微软脚本进行验证:

MicrosoftAjax.js
MicrosoftMvcAjax.js
MicrosoftMvcValidation.js

还有jquery-1.4.4.min.js和jquery.glob这个东西,但我认为我在内部使用它们。验证是由MS脚本完成的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接