2

インターネットやこの Web サイト (web.config のグローバリゼーション カルチャ、モデルに追加された DisplayFormat など) で読んだことのほとんどすべてを試しましたが、答えが見つかりませんでした。

私の Web アプリでは、ユーザーは情報を提供することで人物を作成できます。これらの情報の 1 つは、DateTime 値である開始日です。jQuery UI 日付ピッカーを使用して、カレンダーから日付を選択できるようにしています。日付 (実際には、12 日より後の日付) を選択すると、アプリケーションに検証エラー メッセージが表示されます。たとえば、今日の日付を選択すると、次のように表示されます。値 '03/15/2013' は StartDate には無効です。

私の見解 :

    @model BuSIMaterial.Models.Person

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Person</legend>

        <div class="editor-label">
            First name : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.FirstName, new { maxlength = 50 })
            @Html.ValidationMessageFor(model => model.FirstName)
        </div>

        <div class="editor-label">
            Last name : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.LastName, new { maxlength = 50 })
            @Html.ValidationMessageFor(model => model.LastName)
        </div>

        <div class="editor-label">
            National number : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.NumNat, new { maxlength = 11 })
            @Html.ValidationMessageFor(model => model.NumNat)
        </div>

        <div class="editor-label">
            Start date : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.StartDate, new {@class = "datepicker" })
            @Html.ValidationMessageFor(model => model.StartDate)
        </div>

        <div class="editor-label">
            End date : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.EndDate, new { @class = "datepicker" })
            @Html.ValidationMessageFor(model => model.EndDate)
        </div>

        <div class="editor-label">
            Distance House - Work (km) : 
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.HouseToWorkKilometers)
            @Html.ValidationMessageFor(model => model.HouseToWorkKilometers)
        </div>

        <div class="editor-label">
            Category : 
        </div>
        <div class="editor-field">
            @Html.DropDownList("Id_ProductPackageCategory", "Choose one ...")
            @Html.ValidationMessageFor(model => model.Id_ProductPackageCategory) <a href = "../ProductPackageCategory/Create">Add a new category?</a>
        </div>

        <div class="editor-label">
            Upgrade? : 
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Upgrade)
            @Html.ValidationMessageFor(model => model.Upgrade)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/themes/base/css")
    <script type="text/javascript">
        $(document).ready(function () {
            $(".datepicker").datepicker({

            });
        });
    </script>
}

私の人物モデルの開始日:

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.DateTime StartDate
    {
        get
        {
            return _StartDate;
        }
        set
        {
            OnStartDateChanging(value);
            ReportPropertyChanging("StartDate");
            _StartDate = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("StartDate");
            OnStartDateChanged();
        }
    }
    private global::System.DateTime _StartDate;
    partial void OnStartDateChanging(global::System.DateTime value);
    partial void OnStartDateChanged();

この問題に対処する解決策はありますか?

4

1 に答える 1

2

まず、生のエンティティをビューに渡しているように見えますが、これは良い考えではありません。MVC での正しいアプローチは、ビューが必要とするすべての情報を含むビュー モデルを作成することです。

今あなたの問題に:

日付を選択すると (実際には、12 日よりも大きい日付)、アプリケーションに検証エラー メッセージが表示されます。

これは、これが文化の衝突の問題であるという印象を与えます.MVCアプリは日付を期待していますdd/mm/yyyyが、として受け取っていmm/dd/yyyyます. MVC のデフォルトのモデル バインダーは、現在のスレッドのカルチャを使用します。スレッドが正しいカルチャを使用していることが確実な場合Dateは、 a の代わりに aのみを渡すという事実が気に入らないと思いますがDateTime、ありそうもありません。

通常、最善の方法は、カルチャに依存しない標準化された日付形式、つまりUTC Formatを使用することです。これにより、変換の問題を回避できます。

于 2013-03-15T13:22:32.920 に答える