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()여기 MyCustomExtension에 DateTime?. 그러나 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

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

모델에서 DataType 을 Date 로 정의하는 것만 으로도 작동 한다는 것을 발견했습니다 (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.