2

すべての DateTime プロパティを必要な形式 ("dd/MM/yyyy") でフォーマットする汎用の DateTime エディター テンプレートがあります。

@Html.TextBox(string.Empty, Model.ToString("dd/MM/yyyy"), new { @class = "datepicker" })

しかし、何らかの理由で、フォーマットが私の子アクションに対して機能していません。


MainPage .cshtml で @Html.EditorFor(x => x.MyDate) を実行すると、"23/04/2012" という期待される結果が得られます。

ChildAction .cshtml で @Html.EditorFor(x => x.MyDate) を実行すると、「2012-04-24」という予期しない結果が得られます。


Editor Template が使用されていることを確認できます。これは、次のように変更すると (最初の WTF 文字列に注意してください)、次のようになります。

WTF @Html.TextBox(string.Empty, Model.ToString("dd/MM/yyyy"), new { @class = "datepicker" })

次に、 ChildAction.cshtml で @Html.EditorFor(x => x.MyDate) を実行すると

私は得る:「WTF 2012-04-24」

何か案は?

アップデート

MVC サンプル アプリでこのエラーを再現しようとしたところ、他に 2 つのことが必要であることがわかりました。

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

        if (DateTime.TryParseExact(value.AttemptedValue, "dd/MM/yyyy", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AssumeLocal, out date))
        {
            return date;
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

誰もがそれを配線する方法を知っていると思います。また、MainPage.cshtml で、モデルを 2 番目のパラメーターとして RenderAction に渡す必要があります。

@{Html.RenderAction("Child", Model);}

モデルを 2 番目のパラメーターとして渡す場合、MVC はモデル バインダーを使用して子アクションを呼び出します (なぜですか?)。ただし、日付の形式は MM/dd/yyyy であるため、すべての日付が dd/MM/yyyy 形式であると想定するモデル バインダーでは機能しません。これが機能しない理由です。

しかし、どうすれば修正できますか?日付がデフォルトの dd/MM/yyyy 形式と一致しない唯一の場所は、子アクションをレンダリングするときです。

4

1 に答える 1