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

내 모델 클래스에 유형의 속성이있는 경우 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매개 변수를 사용할 수 없다고 생각 합니다.



답변

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

@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")


답변

속성을 사용하여 뷰 모델 속성을 장식 할 수 있습니다 [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())


답변

모델 내부의 단순 형식 출력

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

또는 foreach 루프에서

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


답변

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

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

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


답변

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

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

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

@model System.DateTime
@Model.ToLongDateString()

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

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

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

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


답변

내가 선호하는 것은 뷰 모델이 아닌 뷰와 함께 형식화 세부 사항을 유지하는 것입니다. 따라서 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")
    });
});

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


답변

나를 위해 일해

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