2012-03-15 5 views
6

C#에서 ASP.NET MVC3 응용 프로그램을 작성하고 있는데 DateTime을 내보기에서 으로 호출하면 다르게 (그리고 잘못) Html.DisplayFor .Html.HiddenFor ASP.NET의 DateTime 형식이 잘못되었습니다.

값을 가져 오는 모델에는 DisplayFormat 데코레이터가 있으며 이는 Html.DisplayFor에서 작동하는 것 같습니다. 문제의 속성으로 기록됩니다

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

그리고보기에는이 사용 : HiddenFor이 value="04/16/2012 00:00:00"로 렌더링하지만

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

DisplayFor 호출 16/04/2012로 날짜를 렌더링합니다.

DateTimeFormat을 설정하기 위해 현재 문화권을 변경해 보았지만 아무 효과가 없었습니다.

현재 문화권은 en-GB이므로 en-US 날짜를 인쇄해서는 안됩니다.

+1

값이 숨겨진 경우 형식이 어떻게 달라졌습니까? 아마 그것은 길에 다시 파싱 될 필요가있을뿐입니다 ...* 인간 소비가 아니라면 형식이 중요하지 않아야합니다. –

+0

@JonSkeet 어떤 이유로 en-GB에서 작동하지만 en-US 날짜가 인쇄되는 모델을 무효화합니다. 그러나이 숨겨진 요소에 대해서만 * –

+1

사용자 정의 편집기 템플릿을 사용할 수 있습니다. 답변보기 : http://stackoverflow.com/questions/8305262/asp-net-mvc-format-of-hidden-datetime –

답변

18

인 -보기 대안을 발생하지 않는 등의 ID를 줄 경우 HTML 숨겨진 속성.

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

모델에서 MeetingStartDate 속성의 가져 오기 기능에 대해 서식이 지정된 DateTime을 반환 할 수 있습니까?

MVC가 현재 속성에 대해 설정된 데이터에서 양식 전송 작업 중에 올바르게 구문 분석 할 수있는 숨겨진 필드에 값을 만들기 때문에 DisplayFormat이 숨겨진 값에 대해 작동하지 않습니다.

MVC에서 예상 한 동작이 무엇입니까?

+0

어떻게 되겠습니까? 형식화 된 날짜,'DateTime'을 문자열로 변환 할 때만 서식이 적용된 것으로 생각 했습니까? –

+3

속성을 사용하여 항목을 비월 화하기를 원한다는 것을 이해하지만이 경우에는 ToString()을 사용하면'@Html.Hidden ("MeetingStartDate", model.MeetingStartDate.ToShortDateString()) ' – bdparrish

+0

이벤트를 사용해야합니다. "dd/MM/yyyy") 해당 성명에 문화를 추가하려고 시도 했습니까? en-US 날짜로 –

8

당신은 당신이 기본 일 (~/Views/Shared/EditorTemplates/HiddenInput.cshtml) 오버라이드 (override) 할 수있는 사용자 정의 편집기 템플릿을 정의 할 수 있습니다 정의 된 형식 존중 숨겨진 필드 생성 할 경우

@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

당신은 문제가 날짜 형식을 지정하는 경우 TextBoxFor가 작동하여

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