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

时间:2012-03-15 17:10:12

标签: c# asp.net-mvc-3 datetime formatting

我正在用C#编写一个ASP.NET MVC3应用程序,并且发现在我的视图中调用Html.HiddenFor会以不同(和不正确)的方式呈现DateTime,如果我要调用{{1} }}

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

Html.DisplayFor

视图显示使用:

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

DisplayFor调用会将日期呈现为 @Html.DisplayFor(model => model.MeetingStartDate) @Html.HiddenFor(model => model.MeetingStartDate) ,但HiddenFor会将其呈现为16/04/2012

我尝试更改当前文化以设置value="04/16/2012 00:00:00",但这没有效果。

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

5 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:8)

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

@if (!ViewData.ModelMetadata.HideSurroundingHtml) 
{
    @ViewData.TemplateInfo.FormattedModelValue
}
@Html.Hidden("", ViewData.TemplateInfo.FormattedModelValue)

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

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

并在您看来:

@Html.DisplayFor(model => model.MeetingStartDate)
@Html.EditorFor(model => model.MeetingStartDate)

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

<input data-val="true" data-val-required="The MeetingStartDate field is required." id="MeetingStartDate" name="MeetingStartDate" type="hidden" value="15/03/2012" />

答案 2 :(得分:4)

或者你可以超越HiddenFor实现并重用TextBoxFor并手动设置 type =“hidden”

这样的事情:

public static MvcHtmlString HiddenInputFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null)
{
  IDictionary<string, object> htmlAttributesTmp = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
  if (htmlAttributesTmp.ContainsKey("type"))
  {
    htmlAttributesTmp["type"] = "hidden";
  }
  else
  {
    htmlAttributesTmp.Add("type", "hidden");
  }

  return html.TextBoxFor(expression, htmlAttributesTmp);
}

答案 3 :(得分:0)

在您的模型中,对于MeetingStartDate属性的Get函数,您可以返回格式化的DateTime吗?

DisplayFormat不适用于隐藏值,因为MVC在隐藏字段中创建一个值,可以在表单提交操作期间从当前为该属性设置的数据中正确解析。

你所拥有的是MVC的预期行动。

答案 4 :(得分:0)

如果你给id这样的问题不会发生

<%= Html.TextBoxFor(model => Model.DiscountRate,new {  @id = "DiscountRate", @Value=Model.DiscountRate})%>