2016-03-08 3 views
3

Я пытаюсь использовать ненавязчивую проверку MVC с плагином jquery globalize в MVC5 (в сочетании с пакетом jquery-validate-globalize). Для учебных целей я начал демонстрационный проект в соответствии с here, но он не может работать с globalize (он работает при невыполненной проверке Microsoft по умолчанию). Модель очень проста:Использование Jquery Globalize с MVC 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 loaded и LOADED EVERYTHING. Более того, когда я пытаюсь проверки на стороне клиента, набрав что-нибудь в номер текстового поля (и, конечно, когда фокус теряется), я получаю следующее сообщение об ошибке в консоли:

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

Это сообщение here похож, и Я попытался проверить перечисленные там вещи. Я думаю, что мои объекты JSON не получены, но я не очень хороший JJ, поэтому я не уверен в этом. Я добавил следующие пункты в 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 загружен») мешает функции нарезки. – Francisco

+2

Нет; Я не смог его решить, поэтому решил не использовать 'глобализацию'. В фактическом проекте я отключил проверку на стороне клиента и полагался на проверку сервера в представлениях, чувствительных к культуре, например, в том числе десятичных вводах. Причина этого решения заключалась в том, что я потратил слишком много времени на это безрезультатно, и было много чего ждать. Возможно, я еще раз повторю этот вопрос в будущей надежде, что технология глобализации будет развиваться тем временем. Постскриптум Проблема сохранялась без 'console.log (« JSONs загружен »)'. – mcy

ответ

4

Я недавно столкнулся с той же проблемой, пытаясь добавить I18n в веб-приложение MVC5. После нескольких дней исследований и отчасти используя ваш код в качестве базы, я нашел некоторые вещи, которые помогли мне реализовать его.

Мое решение: В отдельном проекте, я добавил десятичные и DateTime свойства класса 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»), которая вызвала сбой решения. –

Смежные вопросы