ASP.NET MVC 3에서 특정 형식으로 DateTime을 렌더링하는 방법은 무엇입니까?


117

내 모델 클래스에 유형의 속성이있는 경우 DateTime어떻게 특정 형식으로 렌더링 할 수 ToLongDateString()있습니까 ( 예 : 반환 되는 형식) ?

나는 이것을 시도했다 ...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

...식이 속성 또는 필드를 가리켜 야하기 때문에 예외가 발생합니다. 이...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

... 예외가 발생하지 않지만 렌더링 된 출력이 비어 있습니다 ( val디버거에서 볼 수 있듯이 예상 값이 포함되어 있음).

미리 팁을 주셔서 감사합니다!

편집하다

ToLongDateString단지 예일뿐입니다. 대신에 실제로 사용하고 싶은 ToLongDateString것은 DateTimeand 의 사용자 지정 확장 메서드입니다 DateTime?.

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

따라서 ViewModel 속성에 DisplayFormat특성과 DataFormatString매개 변수를 사용할 수 없다고 생각 합니다.

답변:


159

특정 형식으로 날짜를 표시하기 만하면 다음을 호출하십시오.

@String.Format(myFormat, Model.MyDateTime)

@Html.DisplayFor(...)템플릿을 지정하지 않거나 템플릿을 반복하는 것과 같이 템플릿에 빌드 된 것을 사용해야하는 경우가 아니면 사용 은 추가 작업 일뿐 IEnumerable<T>입니다. 템플릿을 만드는 것은 매우 간단하며 많은 유연성도 제공 할 수 있습니다. 뷰 폴더에라는 현재 컨트롤러 (또는 공유 뷰 폴더)에 대한 폴더를 만듭니다 DisplayTemplates. 해당 폴더 안에 템플릿을 만들려는 모델 유형이있는 부분보기를 추가합니다. 이 경우 /Views/Shared/DisplayTemplates라는 부분보기를 추가 하고 추가했습니다 ShortDateTime.cshtml.

@model System.DateTime

@Model.ToShortDateString()

이제 다음 줄을 사용하여 해당 템플릿을 호출 할 수 있습니다.

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")

감사합니다. 이것은 좋아 보입니다.이 템플릿 매개 변수 ( "ShortDateTime")는 ataddeini 답변에 대한 제 의견에서 설명한 문제도 해결합니다.
Slauma

3
유형이 "DateTime?"인 경우 "DateTime"(@ model DateTime?) 대신 ... ciplay 템플릿은 nullable 또는 not nullable datetimes를 처리합니다. 파일 이름은 "DateTime.cshtml"로 유지되어야합니다.
Romias

+1 이것에 대해 언급해야했고 내 응용 프로그램에서 훌륭하게 작동했습니다! 감사!
Russell Christensen

.... 그것도 템플릿 않고, 모델의 HTML 표현을 렌더링, 추가 작업이 아닌) (@ Html.DisplayFor 사용하는 것은 혼동하지 않습니다 ...
Cabuxa.Mapache

stackoverflow.com/questions/19920603/… @Romias가 언급 한 nullable datetimes를 처리하는 데 도움이되는 코드가 포함되어 있습니다.
Walter de Jong

171

속성을 사용하여 뷰 모델 속성을 장식 할 수 있습니다 [DisplayFormat].

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

그리고 당신의 관점에서 :

@Html.EditorFor(x => x.MyDate)

또는 값을 표시하기 위해

@Html.DisplayFor(x => x.MyDate)

권장하지 않는 또 다른 가능성은 약한 유형의 도우미를 사용하는 것입니다.

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())

1
@Darin : 입력 요소가 아니라 정적 텍스트 출력 만 원합니다. 또한 실제 형식은 사용자 지정 확장 메서드 인 DateTime(ToLongDateString은 예제 일뿐 DataFormatString입니다.) 사용할 수있을 것 같지 않습니다 .
Slauma

2
@Slauma, 어때요 @Html.DisplayFor(x => x.MyDateTime). @NickLarsen이 뷰 모델을 사용해야하는 이유입니다. 내 예에서는이 속성으로 뷰 모델을 장식하고 뷰는 이미 주어진 뷰에 연결되어 있습니다. 그것이 그 목적입니다.
Darin Dimitrov

1
@Slauma, 좋습니다.이 경우 사용자 지정 디스플레이 템플릿을 사용하거나 뷰 모델이 문자열 속성을 사용하도록 할 수 있으며 모델과 뷰 모델간에 매핑 할 때 매핑 계층에서 변환이 수행됩니다 (이 방법으로 여전히 뷰에서 Html.DisplayFor 만 사용합니다.)
Darin Dimitrov

5
@NickLarsen, 아니요, 뷰당 하나의 뷰 모델입니다. 사람들이 이러한 실수를 저지르기 때문에 한 컨트롤러 작업의 유효성 검사에서 일부 속성을 제외하고 다른 작업에서는 제외하려면 어떻게해야합니까? 그래서 너무 일반적입니다.
Darin Dimitrov

1
1 년 후 다시이 질문으로 돌아와서 저는 뷰당 하나의 모델에 대한 주장에 동의합니다. 나는 여전히 디스플레이 선택을 다루는 모든 것이 모델이 아니라 뷰에 있다고 생각합니다.
Nick Larsen 2012

26

모델 내부의 단순 형식 출력

@String.Format("{0:d}", model.CreatedOn)

또는 foreach 루프에서

@String.Format("{0:d}", item.CreatedOn)

사용에 대한 수락 된 답변의 중복처럼 보입니다string.Format
Paul Tyng

2
@PaulTyng이 대답은 받아 들여진 대답보다 나에게 더 명확했습니다 .odesuk는 실제로 newb로서 나를 돕는 첫 번째 매개 변수의 형식을 보여주었습니다.
Dan Beaulieu

1
동의합니다. 이것이 저를 도왔던 대답입니다.
glenn garson

26

다음 접근 방식을 사용하여 형식을 인라인하고 모델의 날짜 속성을 표시합니다.

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

그렇지 않으면 TextBox 또는 Editor를 채울 때 @Darin이 제안한 것처럼 속성을 속성으로 장식 할 수 [DisplayFormat]있습니다.


이것이 제가 찾고있는 솔루션입니다!
Envil

이것이 제가 찾던 솔루션입니다!
Raihan Ridoy

9

모든 DateTime유형이 동일한 방식으로 렌더링되는 경우 사용자 정의 DateTime디스플레이 템플릿을 사용할 수 있습니다 .

Views 폴더에서 컨트롤러 별보기 폴더 또는 "Shared"폴더 아래에 "DisplayTemplates"라는 폴더를 만듭니다 (이 작업은 부분과 유사 함).

내부라는 이름의 파일을 만들 DateTime.cshtml필요 DateTime는 AS @model당신이 당신의 날짜를 렌더링하는 방법과 코드를 :

@model System.DateTime
@Model.ToLongDateString()

이제 뷰에서 이것을 사용할 수 있으며 작동합니다.

@Html.DisplayFor(mod => mod.MyDateTime)

"DisplayTemplates"폴더에 파일을 추가하고 표시하는 유형과 일치하도록 파일 이름을 지정하는 규칙을 따르는 한 MVC는 자동으로이를 사용하여 값을 표시합니다. "EditorTemplates"를 사용하여 시나리오를 편집 할 때도 작동합니다.

템플릿에 대한 추가 정보는 다음과 같습니다 .


감사합니다. 방금 테스트했으며 유형이 실제로 DateTime. 그러나 몇 가지 nullable DateTime 속성이 있습니다. DisplayTemplates라는 폴더에 두 번째 파일을 만들려고했습니다 NullableDateTime.cshtml. @using MyHelpers @model System.DateTime? @Model.MyCustomExtension()여기 MyCustomExtensionDateTime?. 그러나 DateTime? 필드는 실제로 null DateTime이 아니므로 사전에 null이 아닌 유형의 모델 요소가 필요하다는 것을 알려 줍니다. nullable DateTime에 대한 DisplayTemplate을 정의하는 방법이 있습니까?
Slauma

@Slauma : 음, 좋은 질문입니다. 나는 아마도 NullableDateTime.cshtml@NickLarsen이 제안하고 사용하는 접근 방식을 고수하고 사용할 것 @Html.DisplayFor(m => m.MyDateTime, "NullableDateTime")입니다.
ataddeini

DateTime.cshtml 템플릿이 "@model DateTime?"으로 설정된 경우 템플릿 이름을 명시 적으로 추가 할 필요가 없습니다. "DateTime"대신. 이렇게하면 모든 날짜 (null 허용 여부)가 동일한 템플릿에 의해 처리됩니다 ...
Romias

7

내가 선호하는 것은 뷰 모델이 아닌 뷰와 함께 형식화 세부 사항을 유지하는 것입니다. 따라서 MVC4 / Razor에서 :

@Html.TextBoxFor(model => model.DateTime, "{0:d}");

datetime 형식 참조 : http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

그런 다음 JQuery datepicker가 바인딩되어 있으며 날짜를 다른 형식으로 넣습니다 ... doh!

datepicker의 형식을 동일한 형식으로 설정해야하는 것 같습니다.

그래서 저는 System.Globalizationdata- * 속성에 서식을 저장하고 설정할 때 수집합니다.

@Html.TextBoxFor(
    model => model.DateTime.Date, 
    "{0:d}", 
    new 
    { 
        @class = "datePicker", 
        @data_date_format=System.Globalization.CultureInfo
                          .CurrentUICulture.DateTimeFormat.ShortDatePattern 
    }));

그리고 여기에 짜증나는 부분이 있습니다. .net과 datepicker의 형식이 일치하지 않으므로 해커가 필요합니다.

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});

그것은 다소 약하지만 많은 경우를 다루어야합니다.


처음 세 줄이 가장 중요합니다. :) 형식 정의에 대한 예제 및 링크
Borik

2

나를 위해 일해

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>

이 질문은 분명히 면도기 뷰 엔진을 사용하고 있으며 다른 언어를 사용하여 응답했습니다.
Rhys Bevilaqua 2014 년

2

최근에 같은 문제가있었습니다.

모델에서 DataTypeDate 로 정의하는 것만 으로도 작동 한다는 것을 발견했습니다 (Code First 접근 방식 사용).

[DataType(DataType.Date)]
public DateTime Added { get; set; }


0

짧은 형식으로 날짜를 표시하려면 @ Model.date.ToShortDateString ()을 사용하고 날짜를 인쇄합니다.


0

특정 형식으로 날짜를 표시하기 만하면 다음을 호출하십시오.

@Model.LeadDate.ToString("dd-MMM-yyyy")

@Model.LeadDate.ToString("MM/dd/yy")

다음과 같은 형식이됩니다.

26-Apr-2013

04/26/13

@ Model.LeadDate == null이면 어떻게됩니까?
Bimal Das

0

dd/MM/yyyy보기 에 형식으로 표시됩니다.

보기에서 :

DisplayFor이 코드 를 사용하는 대신

<td>

@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")

</td

또한 날짜 열에서 값이 null인지 확인하고 참이면 Date is Empty 또는 열의 실제 형식화 된 날짜를 표시합니다.

희망은 누군가를 돕습니다.


0
@{
  string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
  @datein
}


-2

보기 파일 만 이와 같이 조정합니다. 이것을 시도 할 수 있습니다.

@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                            "{0: yyyy-MM-dd}")

item.transdate그것은 당신입니다 DateTime유형의 데이터입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.