Html.HiddenFor在ASP.NET中错误地格式化DateTime

Joe*_*icz 7 c# formatting datetime asp.net-mvc-3

我正在用C#编写一个ASP.NET MVC3应用程序,并且发现Html.HiddenFor在我的视图中调用将呈现DateTime不同(并且不正确),如果我要调用Html.DisplayFor.

从中获取值的模型确实有一个DisplayFormat装饰器,这似乎适用Html.DisplayFor.有问题的财产写成:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime MeetingStartDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

视图使用以下内容显示:

 @Html.DisplayFor(model => model.MeetingStartDate)
 @Html.HiddenFor(model => model.MeetingStartDate)
Run Code Online (Sandbox Code Playgroud)

DisplayFor调用将呈现日期,16/04/2012但HiddenFor将其呈现为 value="04/16/2012 00:00:00".

我已经尝试改变当前的文化来设置一个,DateTimeFormat但这没有效果.

目前的文化是en-GB,所以它不应该打印en-US日期.

For*_*rdy 23

如果指定日期格式和html隐藏属性,则使用TextBoxFor的视图替代方法将起作用.

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" })
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 8

如果要生成一个尊重您定义的格式的隐藏字段,可以定义一个自定义编辑器模板来覆盖默认的一个(~/Views/Shared/EditorTemplates/HiddenInput.cshtml):

@if (!ViewData.ModelMetadata.HideSurroundingHtml) 
{
    @ViewData.TemplateInfo.FormattedModelValue
}
@Html.Hidden("", ViewData.TemplateInfo.FormattedModelValue)
Run Code Online (Sandbox Code Playgroud)

现在用[HiddenInput]属性装饰你的模型属性:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
[HiddenInput(DisplayValue = false)]
public DateTime MeetingStartDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

在你看来:

@Html.DisplayFor(model => model.MeetingStartDate)
@Html.EditorFor(model => model.MeetingStartDate)
Run Code Online (Sandbox Code Playgroud)

这将使用正确的隐藏值格式:

<input data-val="true" data-val-required="The MeetingStartDate field is required." id="MeetingStartDate" name="MeetingStartDate" type="hidden" value="15/03/2012" />
Run Code Online (Sandbox Code Playgroud)