0

「es-MX」カルチャを使用したasp.net MVCアプリケーションがあります。これが私のweb.configファイルにあるものです:

<globalization enableClientBasedCulture="true" uiCulture="es-MX" culture="es-MX"></globalization>

そして、これが私の_Layoutページにあるものです:

<script type="text/javascript">
    $(function () {
        //set current to the "es-MX" culture script
        kendo.culture("es-MX");
    })
</script>

次のような剣道 DatePicker があります。

@(Html.Kendo().DatePickerFor(model => model.StartDate)
    .HtmlAttributes(new { @class = "input-field" })
)

フォームをコントローラーにポストバックすると、StartDateフィールドは null になります。

サーバーからの応答は次のとおりです。

"Errors":{"StartDate":{"errors":["値 \u002707/10/2016 12:00:00 am\u0027 は Fecha de Inicio では有効ではありません。"]}}

ちなみに、サーバーに送信するリクエストのAccept-Languageが「en-US」になっているのが不思議です。

アップデート:

次のように、DateTime のカスタム モデル バインダーを使用しようとしました。

public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (string.IsNullOrWhiteSpace(value.AttemptedValue))
            return null;

        DateTime dateTime;
        var isDate = DateTime.TryParse(value.AttemptedValue, Thread.CurrentThread.CurrentUICulture, 
            DateTimeStyles.None, out dateTime);

        if (!isDate)
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, "La fecha es válido.");
            return DateTime.UtcNow;
        }

        return dateTime;
    }
}

しかし、コントローラーに渡された日付の時間部分に問題があるようです。この値07/10/2016 12:00:00 a. m.は、"es-MX" カルチャでも "en-US" カルチャでも日付として認識されません。

4

2 に答える 2

0

私は問題が何であるかを理解しました。ドキュメントによると、Kendo UI カルチャ スクリプトはWindows 8形式に基づいて生成されます。私は Windows 7 を使用しています。そのため、現在の .NET または指定されたカルチャに基づいてスクリプトが生成されるように、このカルチャ ヘルパーをページの一番上に配置する必要があります。

@Html.Kendo().Culture()

このヘルパーがないと、サーバーに投稿される日付は07/10/2016 12:00:00 a. m.(a. と m. の間のスペースに注意してください) のようになり、私の MVC はそれらをバインドできません。ヘルパーを使用した後、日付は次のようになります07/10/2016 12:00:00 a.m.(スペースなし)。

于 2016-10-10T14:17:10.417 に答える
0

一見すると、エラー メッセージは、無効な日付形式がモデルに渡されたことを示しています。

"Errors":{"StartDate":{"errors":["値 \u002707/10/2016 12:00:00 am\u0027 は Fecha de Inicio では有効ではありません。"]}}

提供された JSON 形式からの Unicode 変換を考慮すると、メッセージは次のように取得できます。

"Errors":{"StartDate":{"errors":["値 '07/10/2016 12:00:00 am' は Fecha de Inicio には無効です。"]}}

'07/10/2016 12:00:00 a. m.'認識可能な DateTime 値ではなく、文字列として渡された日付形式を示します。したがって、model.StartDateAM/PM 状態の時刻部分は有効なDateTimeまたはNullable<DateTime>値ではないため、null を返します。

グローバリゼーション スクリプトをビューに設定してみてください。

@section HeadContent 
{
    <script src="@Url.Content("~/Scripts/kendo.all.min.js")"></script>
    <script src="@Url.Content("~/Scripts/cultures/kendo.culture.es-MX.min.js")"></script>
}

またはレイアウトページ:

<head>
<script src="@Url.Content("~/Scripts/kendo.all.min.js")"></script>
<script src="@Url.Content("~/Scripts/cultures/kendo.culture.es-MX.min.js")"></script>
</head>

注意: ~/Scripts/cultures/Kendo JS ディレクトリ パスに変更します。

上記の試みでもうまくいかない場合は、表示形式の文字列を on に設定しますDatePickerFor

@{
    Culture = "es-MX";
}

@(Html.Kendo().DatePickerFor(model => model.StartDate)
    .Name("StartDate")
    .Culture("es-MX")
    .Format("dd/MM/yyyy")
    .ParseFormats(new String[] { "dd/MM/yyyy" })
    .HtmlAttributes(new { @class = "input-field" })
)

または、日付入力のカスタム ルールを次のように追加します (日付形式 dd.MM.yyyy KENDO MVC を有効にする方法の Edin Mahmutovic の回答から適応):

kendo.ui.validator.rules.mvcdate = function (input) {
    if ($(input.attr('name')) === 'StartDate') {
        return input.val() === "" || kendo.parseDate(input.val(), "dd/MM/yyyy") !== null;
    }
    return true;
}

私の知る限り、特定の日付形式文字列がFormatメソッドによって設定されていない場合、この例に示されているデフォルト形式が使用されます: http://demos.telerik.com/aspnet-mvc/datepicker/index

関連する問題:

2 つの異なるタイムゾーンの異なるコンピューターで剣道の日付ピッカーの動作がおかしくなる

剣道 DatePicker カルチャが正しく機能しない

http://www.telerik.com/forums/wrong-format

グローバリゼーション リファレンス: http://docs.telerik.com/kendo-ui/aspnet-mvc/globalization

于 2016-10-10T03:09:33.807 に答える