簡體   English   中英

在MVC 5中使用Jquery Globalize

[英]Using Jquery Globalize with MVC 5

我正在嘗試在MVC5中將jquery globalize插件與MVC unobstrtrusive驗證一起使用(與jquery-validate-globalize軟件包結合使用)。 出於學習目的,我按照此處啟動了一個演示項目,但是無法與globalize一起運行(它適用於默認的Microsoft非侵入式驗證)。 該模型非常簡單:

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

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

我嘗試在_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>

但是,當我運行該頁面時,我只會看到控制台日志JSOns loadedLOADED EVERYTHING 此外,當我嘗試通過在數字文本框中鍵入任何內容來進行客戶端驗證時(當然,當焦點丟失時),在控制台中會出現以下錯誤:

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

這里的帖子與類似,我嘗試檢查其中列出的內容。 我認為我的JSON對象沒有被獲取,但是我對aj JS不好,所以我不確定。 我將以下項目添加到web.config中,以查看這是否與文件服務相關,但無濟於事:

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

在web.config中將區域性設置為auto,如下所示:

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

您可以在此處查看“ Scripts文件夾結構:

您可以在此處查看<code> Scripts </ code>文件夾結構

那么,這是什么問題呢? 我該如何使這東西工作?

我最近遇到了同樣的問題,試圖將I18n添加到MVC5 Web應用程序中。 經過幾天的研究,並部分使用您的代碼作為基礎,我發現了一些有助於實現它的東西。

我的解決方案:在一個單獨的項目中,我向ApplicationUser類添加了十進制和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; }
}

我還修改了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文件。

我也將此鏈接用於依賴關系。 但是,然后我在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視圖腳本根本沒有被修改,並且控制台日志沒有問題。

就是這樣,它對我有用,因為這是一個非常相似的案例,我希望它也對您有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM