我有一个通用的 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”
我可以确认正在使用编辑器模板,因为如果我像这样更改它(注意开头的 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 示例应用程序中重现此错误,我发现还需要另外两件事:
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 中,您必须将模型作为第二个参数传递给 RenderAction
@{Html.RenderAction("Child", Model);}
当传递模型作为第二个参数时,MVC 使用模型绑定器来调用子操作(为什么?)。但是,日期的格式是 MM/dd/yyyy,所以它不适用于我的模型活页夹,它假设我所有的日期都是 dd/MM/yyyy 格式。这就是为什么这不起作用。
但是我该如何解决呢?日期与我的默认格式 dd/MM/yyyy 不匹配的唯一地方是呈现子操作时。