2012-03-15 78 views
6

我正在C#中编写ASP.NET MVC3应用程序,并发现在我的视图中调用Html.HiddenFor将呈现DateTime与如果我要调用Html.DisplayFor时不同(并且不正确) 。Html.HiddenFor在ASP.NET中错误地格式化日期时间

它从中取值的模型确实有DisplayFormat装饰器,这似乎适用于Html.DisplayFor。有关财产被写成:

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

和视图显示此使用:

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

的DisplayFor通话将呈现日期16/04/2012但是HiddenFor将呈现为value="04/16/2012 00:00:00"

我试过改变当前的文化来设置一个DateTimeFormat但这没有效果。

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

+1

如果这个值被隐藏了,为什么它的格式如何?据推测,它只需要在回来的路上再次解析...如果它不是用于*人类消费的话,那么格式应该不重要。 – 2012-03-15 17:15:31

+0

@JonSkeet出于某种原因,这会使模型无效,即时工作在en-GB上,但它打印出一个en-US的日期。但*只*为这个隐藏的元素 – 2012-03-15 17:27:42

+1

您可以使用自定义编辑器模板请参阅答案:http://stackoverflow.com/questions/8305262/asp-net-mvc-format-of-hidden-datetime – 2016-04-28 10:36:48

回答

18

的中视替代和HTML隐藏属性。

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

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

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

你有什么是预期MVC的行动。

+0

你会如何返回格式化的日期,我认为格式只适用于将'DateTime'转换为字符串? – 2012-03-15 17:29:51

+3

我明白你想使用属性脚手架你的项目,但在这种情况下,你将不得不使用'@ Html.Hidden(“MeetingStartDate”,model.MeetingStartDate.ToShortDateString())' – bdparrish 2012-03-15 17:38:58

+0

事件如果我使用ToString “dd/MM/yyyy”),它仍然会输出日期作为美国日期 – 2012-03-16 11:27:25

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" /> 
4

或者你可以智取HiddenFor实施和重用TextBoxFor代替,并手动设置类型=“隐藏”

事情是这样的:

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); 
} 
0

如果你给ID一样,如果指定的日期格式问题不使用TextBoxFor将工作发生

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