将 Jquery Globalize 与 MVC 5 结合使用

mcy*_*mcy 2 javascript c# asp.net-mvc jquery jquery-globalize

我正在尝试在 MVC5 中将 MVC 不显眼的验证与 jquery globalize 插件一起使用(与包jquery-validate-globalize结合使用)。出于学习目的,我按照此处启动了一个演示项目,但它无法使用全球化运行(它适用于默认的 Microsoft 不显眼的验证)。该模型非常简单:

public class GlobalizeModel
{
    [Range(10.5D, 20.3D)]
    public decimal Double { get; set; }

    [Required]
    public DateTime? DateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我尝试在 _Layout 页面底部按如下方式启动 Globalize(视图很小,只有 2 个输入):(我从https://johnnyreilly.github.io/globalize-so-what-c ​​ha 获取必要文件的列表-想/

<script src="~/Scripts/bootstrap.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

<!--cldr scripts-->
<script src="~/Scripts/cldr.js"></script>
<script src="~/Scripts/cldr/event.js"></script>
<script src="~/Scripts/cldr/supplemental.js"></script>
<!--globalize scripts-->
<script src="~/Scripts/globalize.js"></script>
<script src="~/Scripts/globalize/number.js"></script>
<script src="~/Scripts/globalize/date.js"></script>
<!--jquery globalize-->
<script src="~/Scripts/jquery.validate.globalize.js"></script>


<script>

    $.when(
        $.getJSON("/Scripts/cldr/supplemental/likelySubtags.json"),
        $.getJSON("/Scripts/cldr/main/en/numbers.json"),
        $.getJSON("/Scripts/cldr/supplemental/numberingSystems.json"),
        $.getJSON("/Scripts/cldr/main/en/ca-gregorian.json"),
        $.getJSON("/Scripts/cldr/main/en/timeZoneNames.json"),
        $.getJSON("/Scripts/cldr/supplemental/timeData.json"),
        $.getJSON("/Scripts/cldr/supplemental/weekData.json"),
        $.getJSON("/Scripts/cldr/main/tr/numbers.json"),
        $.getJSON("/Scripts/cldr/main/tr/ca-gregorian.json"),
        $.getJSON("/Scripts/cldr/main/tr/timeZoneNames.json"),
        console.log("JSONs loaded")
        ).then(function () {
            console.log("start slicing");
            return [].slice.apply(arguments, [0]).map(function (result) {
                console.log("slicing done");
                return result[0];
            });
        }).then(Globalize.load).then(function () {
            Globalize.locale("en");
            console.log("Locale set to en");
        }).then(console.log("LOADED EVERYTHING"));


</script>
Run Code Online (Sandbox Code Playgroud)

但是当我运行该页面时,我只看到控制台日志JSOns loadedLOADED EVERYTHING. 此外,当我通过在数字文本框中键入任何内容来尝试客户端验证时(当然,当焦点丢失时),我在控制台中收到以下错误:

Uncaught Error: E_DEFAULT_LOCALE_NOT_DEFINED: Default locale has not been defined.
Run Code Online (Sandbox Code Playgroud)

这里的这篇文章是类似的,我尝试检查那里列出的内容。我认为我的 JSON 对象没有被获取,但我不太擅长 aj JS,所以我对此不确定。我在 web.config 中添加了以下项目,看看这是否与文件服务有关,但没有结果:

<system.webServer>
 <staticContent>
  <remove fileExtension=".json"/>
  <mimeMap fileExtension=".json" mimeType="application/json" />
 </staticContent>
</system.webServer> 
Run Code Online (Sandbox Code Playgroud)

在 web.config 中将区域性设置为 auto,如下所示:

<system.web>
  <globalization culture="auto" uiCulture="auto" />
  <compilation debug="true" targetFramework="4.5.2"/>
  <httpRuntime targetFramework="4.5.2"/>
</system.web>
Run Code Online (Sandbox Code Playgroud)

Scripts您可以在此处查看文件夹结构:

您可以在此处查看 <code>Scripts</code> 文件夹结构

那么,这里有什么问题呢?我怎样才能让这个东西发挥作用?

小智 5

我最近遇到了同样的问题,尝试将 I18n 添加到 MVC5 Web 应用程序。经过几天的研究并部分使用您的代码作为基础,我发现了一些可以帮助我实现它的东西。

我的解决方案:在一个单独的项目中,我向 ApplicationUser 类添加了decimal和DateTime属性:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }

    public DateTime birthdate { get; set; }
    public decimal balance { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我还修改了 RegisterViewModel 以接受这些属性,如下所示:

public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public DateTime birthdate { get; set; }

    [Required]
    [DataType(DataType.Currency)]
    public decimal balance { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,我在基本控制器中设置区域性,其他控制器从中继承:

public class BaseController : Controller
{
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
    {
        string[] cultures = { "es-CL", "es-GT", "en-US" };
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultures[1]);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

        return base.BeginExecuteCore(callback, state);
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是出于测试目的,而不是我在真实应用程序中获取文化的方式。

我的文件结构和你的一样,我没有修改web.config文件。

我还使用链接来获取依赖项。但后来我修改了 Register.cshtml 脚本部分中的一些内容:

<!-- CLDR -->
<script src="~/Scripts/cldr.js"></script>
<script src="~/Scripts/cldr/event.js"></script>
<script src="~/Scripts/cldr/supplemental.js"></script>
<!-- Globalize -->
<script src="~/Scripts/globalize.js"></script>
<script src="~/Scripts/globalize/number.js"></script>
<script src="~/Scripts/globalize/date.js"></script>
<!-- $ validate -->
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.globalize.js"></script>
<!-- fetch files -->
<script>
    $.when(
        $.getJSON("/Scripts/cldr/supplemental/likelySubtags.json"),
        $.getJSON("/Scripts/cldr/main/en/numbers.json"),
        $.getJSON("/Scripts/cldr/supplemental/numberingSystems.json"),
        $.getJSON("/Scripts/cldr/main/en/ca-gregorian.json"),
        $.getJSON("/Scripts/cldr/main/en/timeZoneNames.json"),
        $.getJSON("/Scripts/cldr/supplemental/timeData.json"),
        $.getJSON("/Scripts/cldr/supplemental/weekData.json"),
        $.getJSON("/Scripts/cldr/main/tr/numbers.json"),
        $.getJSON("/Scripts/cldr/main/tr/ca-gregorian.json"),
        $.getJSON("/Scripts/cldr/main/tr/timeZoneNames.json"),
        ).then(function () {
            console.log("start slicing");
            return [].slice.apply(arguments, [0]).map(function (result) {
                console.log("slicing done");
                return result[0];
            });
        }).then(Globalize.load).then(function () {
            Globalize.locale("en");
            console.log("Locale set to en");
        }).then(console.log("LOADED EVERYTHING"));
</script>
Run Code Online (Sandbox Code Playgroud)

_Layout 视图脚本根本没有修改,并且我对控制台日志没有任何问题。

就这样,它对我有用,并且由于这是一个非常相似的案例,我希望它也对您有用。