2012-03-15 80 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})%>