@ Html.DisplayFor-DateFormat ( "mm / dd / yyyy")


88

mm/dd/yyyy날짜 형식을 원하는 다음 면도기 코드가 있습니다.

Audit Date: @Html.DisplayFor(Model => Model.AuditDate)

나는 여러 가지 접근 방식을 시도했지만 그 접근 방식 중 어느 것도 내 상황에서 작동하지 않습니다.

내 AuditDate는 DateTime?유형입니다.

나는 이와 같은 것을 시도 하고이 오류가 발생했습니다.

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

추가 정보 : 템플릿은 필드 액세스, 속성 액세스, 단일 차원 배열 인덱스 또는 단일 매개 변수 사용자 지정 인덱서 식에만 사용할 수 있습니다.

이것을 시도 :

@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))

'ToString'메서드에 대한 오버로드는 1 개의 인수를 사용합니다.

답변:


161

를 사용하는 경우 속성을 DisplayFor통해 형식을 정의 DisplayFormat하거나 사용자 정의 표시 템플릿을 사용해야합니다. (사전 설정의 전체 목록은 여기DisplayFormatString 에서 찾을 수 있습니다 .)

[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime? AuditDate { get; set; }

또는보기를 만듭니다 Views\Shared\DisplayTemplates\DateTime.cshtml.

@model DateTime?
@if (Model.HasValue)
{
    @Model.Value.ToString("MM/dd/yyyy")
}

DateTime하지만 시간을 인코딩하는 경우에도 모든에 적용됩니다 . 날짜 전용 속성에만 적용 Views\Shared\DisplayTemplates\Date.cshtml하려면 DataType속성에서 및 속성을 사용하십시오.

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

마지막 옵션은 DisplayFor속성을 사용하지 않고 대신 직접 렌더링하는 것입니다.

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}

제안한대로 displayTemplate을 만들었습니다. 템플릿에있는 코드를 복사하여 붙여 넣으면이 오류가 발생합니다No overload for method 'ToString' takes 1 arguments
Nick Kahn

3
나는 그것이해야한다고 생각[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]

[DisplayFormat (DataFormatString = "{0 : dd / MM / yyyy}")]은 터키에서 근무했습니다. 감사합니다
zapoo

@Mac : 무슨 말씀 이시죠? 그들은 매우 많은 일을하지만, 아마도 그냥 특정 시나리오한다. 더 많은 정보 없이는 당신의 상황을 말할 수 없습니다.
Chris Pratt

편집기에서도 형식을 사용 ApplyFormatInEditMode = true하도록하려면 속성에 추가 하십시오 [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)].. 분명해야하지만, 당신이 모두 쓸데없는 복사-붙여 넣기를 할 때 intellisense의 힌트가 내 것처럼 코를 지나갈 수도 있습니다. :)
Heki

19

해당 모델 속성의 값을 단순히 출력하는 경우 DisplayForhtml 도우미 가 필요하지 않으며 적절한 문자열 형식으로 직접 호출하면됩니다 .

Audit Date: @Model.AuditDate.Value.ToString("d")

출력해야 함

Audit Date: 1/21/2015

마지막으로 감사 날짜가 null 일 수 있으므로 nullable 값의 형식을 지정하기 전에 조건부 확인을 수행해야합니다.

@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}

수신되는 오류를 인터넷 검색하면 이 답변이 제공 되며 , 이는 오류가 Html 도우미에서 Model이라는 단어를 사용하여 발생했음을 보여줍니다. 예를 들어 @Html.DisplayFor(Model=>Model.someProperty). Model예를 들어, 이외의 다른 것을 사용하도록 변경 @Html.DisplayFor(x=>x.someProperty)하거나 이러한 도우미에서 대문자 M를 소문자 m로 변경하십시오 .


내가 사용하는 경우 @Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
닉 칸

@AbuHamzah-여전히 이것을 Html.DisplayFor도우미 에 넣으려는 것 같습니다 . 그러지 마. 또한 DisplayFor도우미 를 사용하려는 다른 속성이 아닌 해당 줄에 오류가 발생하는지 확신 합니까?
Tommy

내가 사용한 경우 @Model...다음과 같은 오류가 발생합니다. 'Model'이 System.Web.Mvc.WebViewPage <TModel> .Model 선언과 충돌합니다. '
Nick Kahn

@AbuHamzah 업데이트 된 답변의 마지막 단락을 참조하십시오.
Tommy

11

내 코드에서이 변경 사항을 사용하고 있습니다.

이전 코드 :

 <td>
  @Html.DisplayFor(modelItem => item.dataakt)
 </td>

신규 :

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>

... 그리고? 이것은 대답입니까, 무엇입니까?
마치에이 Jureczko

예, 주제의 문제에 대한 단순한 해결책입니다. 누군가에게 도움이 될 것이라고 생각했습니다.
Piotr Mirek

좋습니다. "내 코드에서이 변경 사항을 사용하고 있습니다."를 구체적으로 이것이 해결책이라는 것을 나타내는 것으로 변경하는 것이 좋습니다.
Maciej Jureczko 2017-10-26

간단하고 편리한 답변, 감사합니다 !!
스캐너


5

비슷한 방식으로 구현했습니다.

  1. TextBoxFor 를 사용 하여 날짜를 필수 형식으로 표시하고 필드를 읽기 전용으로 만듭니다.
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. CSS로 TextBox에 윤곽선테두리0으로 지정 합니다.

.my-style {
    outline: none;
    border: none;
}

그리고 ...... 끝났습니다 :)


1
그런데 왜 그렇게 하시겠습니까?
CodeCaster

다른 방법 중 어느 것도 저에게 효과가 없었기 때문에 많은 코딩을 절약했습니다. 또한 최종 결과는 읽기 전용이고 테두리가 없으므로 텍스트 상자처럼 보이지 않았습니다.
Akshat

4

나를 위해 사용하기에 충분했습니다.

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }

4

전체 프로젝트에이 형식을 적용하려는 경우 뷰 모델 에서 [ DisplayFormat ] 속성을 사용할 수 있습니다 .

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }

2

파헤 치고 나서 컨트롤러의 액션 메서드에 CultureInfo ( "en-US") 를 갖도록 ThreadCurrentCulture 값을 설정했습니다 .

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

모든보기에서이 설정을 사용하려는 경우 몇 가지 다른 옵션 이 있습니다.

CurrentCulture속성 값 정보 :

하는 CultureInfo 함께 관련 객체와이 속성에 의해 반환되는 객체는, 날짜, 시간, 숫자, 통화 값, 텍스트의 정렬 순서, 케이싱 규칙 및 문자열 비교에 대한 기본 형식을 결정합니다.

출처 : MSDN CurrentCulture

참고 :CurrentCulture 컨트롤러가 이미 CultureInfo("en-US")날짜 형식이 인 또는 이와 유사한 상태로 실행중인 경우 이전 속성 설정은 선택 사항 일 수 "MM/dd/yyyy"있습니다.

CurrentCulture속성을 설정 한 후 코드 블록을 추가하여 날짜를 "M/d/yyyy"뷰의 형식으로 변환합니다 .

@{  //code block 
    var shortDateLocalFormat = "";
    if (Model.AuditDate.HasValue) {
       shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
       //alternative way below
       //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
    }
}

@shortDateLocalFormat

위의 @shortDateLocalFormat변수는 ToString("M/d/yyyy")작품 으로 형식이 지정됩니다 . ToString("MM/dd/yyyy")를 사용 하면 처음에 한 것처럼 문제가 발생하지 않습니다 . Tommy ToString("d") 가 추천하는 작품도 마찬가지입니다. 실제로 "d""짧은 날짜 패턴"을 나타내며 다른 문화 / 언어 형식으로도 사용할 수 있습니다.

위의 코드 블록은 멋진 도우미 메서드 또는 이와 유사한 방법 으로 대체 될 수도 있습니다 .

예를 들면

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {     
        shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
     }

    @shortDateLocalFormat
}

이 도우미 호출과 함께 사용할 수 있습니다.

@DateFormatter(Model.AuditDate)

Update , DateTime.ToString (String, IFormatProvider) 메서드를 사용할 때 동일한 작업을 수행하는 다른 방법이 있음을 알았습니다 . 이 방법을 사용하면 ThreadCurrentCulture속성 을 사용할 필요가 없습니다 . 는 CultureInfo("en-US")> - 번째 인수로서 건네 IFormatProvider를 하는 DateTime.ToString(String, IFormatProvider)방법.

수정 된 도우미 메서드 :

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {
       shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
    }

    @shortDateLocalFormat
}

.NET 바이올린


1

어쩌면 간단하게

@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)

또한 .ToString ( "dd MMM, yyyy") .ToString ( "d") 등과 같은 많은 유형의 문자열 형식을 사용할 수 있습니다.


오류가 발생합니다 : 'Model'이 'System.Web.Mvc.WebViewPage <TModel> .Model'선언과 충돌합니다.
Nick Kahn

내가 사용 @model하면 인식되지 않습니다
Nick Kahn

@AbuHamzah- MHTML 페이지에서 m사용할 때 대문자 , 선언 할 때 소문자 로 착각했습니다 .
Tommy

여전히 오류가 나는 토미의 대답에 회신 참조하십시오
닉 칸

1
No overload for method 'ToString' takes 1 arguments내가 사용하는 경우 불평ToString("mm/dd/yyyy")
닉 칸

1

보기에서 다음을 교체하십시오.

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

와:

@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}

설명 : AuditDate 값이 널이 아니면 날짜를 dd / MM / yyyy로 형식화하고 그렇지 않으면 값이 없기 때문에 그대로 두십시오.


0

내 컨트롤러에서 비슷한 문제가 있었고 여기에 저에게 효과적이었습니다.

model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""

"DateSigned"는 내 모델의 값입니다. 라인은 모델 값에 값이 있으면 값을 형식화하고 그렇지 않으면 아무것도 표시하지 않습니다.

도움이되는 희망


0

이것은 간단한 날짜 문자열을 얻는 가장 좋은 방법입니다.

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()

이 답변이하는 일은 다음과 같습니다.으로 HtmlString출력을 가져 와서으로 DisplayFor변환하고으로 String파싱 DateTime한 다음 String. 제 생각에는 불필요하게 복잡합니다.
이교도 원숭이

0

Convert를 사용할 수 있습니다.

 <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 

-1

에 대한 이 답변 보기No overload for method 'ToString' takes 1 arguments오류 .

nullable DateTime의 형식을 지정할 수 없습니다. DateTime.Value 속성을 사용해야합니다.

@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty

팁 : 뷰에 넣기 전에 intellisense를 사용하여 표준 클래스에서이 작업을 수행하는 것이 항상 도움이됩니다. 이 경우 클래스에서 쉽게 발견 할 수있는 컴파일 오류가 발생합니다.


제안 된 코드를 사용하면이 오류가 발생합니다'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.