【问题标题】:ASP.NET MVC 3 RC 2 client side validation with globalizationASP.NET MVC 3 RC 2 客户端验证与全球化
【发布时间】:2010-12-17 16:51:19
【问题描述】:

我的目标是根据用户的文化在客户端验证用户输入。

我有一个具有以下结构的原始数据模型:

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

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

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

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

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

非常感谢任何帮助!提前谢谢!

【问题讨论】:

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


    【解决方案1】:

    不幸的是,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)); 作为函数体。
    • 您通知插件创建者了吗?如果尚未完成,请您这样做。我和 sde 有同样的问题,但我不想用非官方或覆盖方法“破解”。
    • 好吧,刚刚为我节省了大量代码挖掘 - 你是明星,非常感谢您的博客文章并在 SO 上分享!
    • 如果我想同时验证 0.1 和 0,1 怎么办?
    • 如果你想验证两者,那么只需在验证器函数中编写你自己的代码。我想您可以使用 Globalization 插件来验证特定的文化 - 只需检查一下。
    【解决方案2】:

    我不得不禁用 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 脚本完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2014-07-21
      • 1970-01-01
      相关资源
      最近更新 更多