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

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

<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 Globalization PlugIn)前面提到的jquery.validate.min.jsjquery.validate.unobtrusive.min.js

<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文本框中输入“高度”的值(注意德语“拼写”),The field Height must be a number则会出现验证错误消息,并且我无法提交表单。
  • 如果我输入0.1(英文“拼写”),我可以提交表单,但服务器端验证返回以下验证错误消息The value '0.1' is not valid for Height.

所以现在我陷入了某种死锁,我无法脱身。

同样,我的目标是根据用户的文化验证客户端和服务器端输入的十进制数字(在这种情况下,它被强制为德语)。我究竟做错了什么?

非常感谢任何帮助!先感谢您!

4

2 回答 2

8

不幸的是,jQuery.validate.format 和 jQuery.Globalization.format 函数之间存在命名冲突。因此,您必须更改代码以使用非 jquery 全球化插件。

我刚刚在这里写了一篇关于它的博客文章。

对你来说,它应该是这样的:

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

这应该足够了。

于 2010-12-28T12:59:31.840 回答
1

我不得不禁用 UnobtrusiveJavaScript。该页面不再立即做出反应,但至少它可以工作。

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

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

我使用 Microsoft 脚本进行验证:

MicrosoftAjax.js
MicrosoftMvcAjax.js
MicrosoftMvcValidation.js

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

于 2010-12-17T17:01:02.073 回答