2016-03-08 73 views
3

我想在MVC5中使用MVC unobstrusive验证jQuery全球化插件(与包jquery-validate-globalize一起使用)。为了学习目的,我开始了一个演示项目,按照here,但它无法运行全球化(它在默认的微软unobstrusive验证)。该模型是非常简单的:使用MVC 5 jQuery全球化5

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

    [Required] 
    public DateTime? DateTime { get; set; } 
} 

我尝试启动Globalize的截至_layout页面底部如下(视图是最小的有2只输入):(我得到必要的文件列表从https://johnnyreilly.github.io/globalize-so-what-cha-want/

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

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

Uncaught Error: E_DEFAULT_LOCALE_NOT_DEFINED: Default locale has not been defined. 

这篇文章here是相似的,我试图检查那里列出的东西。我认为我的JSON对象没有被抓取,但我不是很好的JS,所以我不确定。我加的下列项目的web.config,看看这是与文件服务相关的东西,有没有效果:

<system.webServer> 
<staticContent> 
    <remove fileExtension=".json"/> 
    <mimeMap fileExtension=".json" mimeType="application/json" /> 
</staticContent> 
</system.webServer> 

的区域性设置为自动在web.config中如下:

<system.web> 
    <globalization culture="auto" uiCulture="auto" /> 
    <compilation debug="true" targetFramework="4.5.2"/> 
    <httpRuntime targetFramework="4.5.2"/> 
</system.web> 

你可以看到这里Scripts文件夹结构:

You can see <code>Scripts</code> folder structure in here

那么,有什么问题在这里?我怎样才能使这件事情工作?

+0

你有没有发现发生了什么?我认为console.log(“JSONs loaded”)干扰了切片功能。 – Francisco

+2

否;我无法解决它,所以我决定不使用'globalize'。在实际的项目中,我禁用了客户端验证,并依赖于文化敏感视图(例如包含十进制输入的视图)中的服务器验证。这个决定背后的原因是我花了太多时间在这方面无济于事,还有很多事情要做。也许我会在未来希望重新审视这个问题,希望全球化技术在此同时发展。附:如果没有'console.log(“JSONs loaded”)'',问题依然存在。 – mcy

回答

4

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

我的解决方案: 在一个单独的项目,我添加小数和日期时间属性的ApplicationUser类:

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

我还修改了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; } 
} 

然后,我将文化设置在基本控制器中,其他控制器从其继承:

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

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

我的文件结构与您的文件结构相同,我没有修改web.config文件。

我也用this链接的依赖关系。但后来我在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> 

的_layout视图脚本并没有在所有的修改,我曾与控制台日志没有问题。

就是这样,它适合我,因为它是一个非常相似的情况,我希望它也适用于你。

+0

谢谢!一旦我有时间,我会尝试你的建议,看看它是否有效。 – mcy

+0

我刚刚删除了导致解决方案崩溃的console.log(“JSONs loaded”)行。 –