すべての 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 形式と一致しない唯一の場所は、子アクションをレンダリングするときです。