TextBoxFor ()의 날짜 만


271

TextBoxFor <,> (expression, htmlAttributes)를 사용하여 DateTime의 유일한 날짜 부분을 텍스트 상자에 표시하는 데 문제가 있습니다.

이 모델은 Linq2SQL을 기반으로하며 필드는 SQL 및 엔터티 모델의 DateTime입니다.

실패한:

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

이 트릭은 감가 상각되는 것 같습니다. htmlAttribute 객체의 문자열 값은 무시됩니다.

실패한:

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

"00:00:00"부분없이 세부 정보 / 편집보기에서 날짜 부분 만 저장하고 표시하고 싶습니다.

답변:


237
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }

그때:

<%=Html.EditorFor(m => m.StartDate) %>

그렇습니다. 이제 EditorFor 도우미가 있고 MVC2가 완성되었으므로 솔루션이 나아갈 것입니다
Kronos

66
그러나 이제 Jquery UI datepicker는 Html.EditorFor () 도우미에 지정된 내 @ class = "datepicker"특성을 무시하므로이 입력에 적용 할 수 없습니다. 따라서이 텍스트 상자는 이제 올바르게 포맷되지만 클릭해도 날짜 선택기가 시작되지 않습니다. 그래서 하나의 문제를 해결하고 다른 것을 깨뜨 렸습니다.
Aaron

5
이 솔루션과 함께 표시하는 방법은 물론 Html.TextboxFor ()와 마찬가지로 datepicker를 시작하도록 할 수 있습니다
Aaron

49
MVC4 Razor 구문을 사용하고 있는데 날짜 필드는 그대로 렌더링되고 @Html.EditorFor(m => m.IssueDate)모델의 서식은 그대로 적용 [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]되지만 날짜는 여전히01/01/0001 12:00:00 AM
bjan

4
@Aaron htmlAttributes 매개 변수가있는 EditorFor의 오버로드가 없습니다. 아마도 htmlAttributes를 전달한다고 생각하여 viewTemplate 매개 변수 또는 다른 것에 전달할 것입니다. 이것이 Editorfor의 단점입니다. TextBoxFor는 DisplayFormat 주석을 무시합니다. Alexeyss의 솔루션은이 문제를 해결하기 위해 형식을 다르게 적용합니다.
AaronLS

362

MVC4TextBoxFor문자열 형식 매개 변수를 사용 하는 새 과부하 를 추가하여이 문제를 해결했습니다 . 이제 간단하게이 작업을 수행 할 수 있습니다.

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

html 속성을 사용하는 과부하가 있으므로 CSS 클래스를 설정하고 날짜 선택기를 연결하는 등을 할 수 있습니다.

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })

40
이것은 MVC4에 대한 최상의 답변입니다-jquery UI datepicker를 사용하여 선택을 형식화 할 수 있습니다.@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb

3
감사합니다! 그러나 TextBoxFor가 모델의 [DisplayFormat]속성을 무시하는 버그처럼 보입니다 . TextBoxFor에 최소한 재정의가 있고 기뻐했습니다.
Neil Laslett

7
나는 이것을 이렇게 설정 @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")했지만 httpPost에서 MM.dd.yyyy와 같은 데이터를 얻습니다. 이것을 해결하는 방법?
user007

3
나는 당신에게 맥주를 사요! 이 작은 문제로 인해이 답변을 찾을 때까지 두통이 발생했습니다.
JoshYates1980

3
참고 : 많은 브라우저input[type=date]사양에"{0:yyyy-MM-dd}" 형식이 필요 합니다.
KyleMit

259
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>

5
EditorFor 솔루션은 id 또는 클래스와 같은 다른 HTML 속성을 재정의해야하는 경우를 제외하고 작동합니다. 이것은 훌륭한 솔루션입니다. V는 대문자 여야합니다.
벤 밀스

1
null을 안전하게 처리하기 위해 Model.EndDate.GetValueOrDefault (). ToString ( "dd.MM.yyyy")을 수행 할 수 있습니다. Model.EndDate가 널인 경우 기본값 Datetime이 표시됩니다.

15
null과 관련하여 DateTime의 기본값은 1901 년 1 월 1 일입니다. 제 생각에 사용하는 것이 좋습니다.@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan

1
@ Spikolynn, 이것은 나를 위해 두 번째 'Value'속성을 생성하지 않았습니다 (MVC3 / 면도기 템플릿).
Doug S

2
중요 : "값"에서 대문자 "V"를 확인하십시오. 소문자는 사용하지 않습니다!
Tejasvi Hegde

48

또는 형식화되지 않은 도우미를 사용하십시오.

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>

22
약간의 변형@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman

ASPX 뷰 엔진 대신 Razor를 사용하지만 MVC 4에서 작동하며 한 구문에서 다른 구문으로 변경하는 것은 쉽지 않습니다. 내가 사용하고 테스트 한 면도기 원인에 게시했습니다. 내가 말했듯이, 그것은 변형입니다.
Dan Friedman

1
@ Dan Friedman : 이것은 나를 위해가는 길이었다! 예전에는 편집기 템플릿으로 작업했지만 자체 HTML을 작성하고 모든 유효성 검사 메시지와 모든 Bootstrap 속성을 포함해야했기 때문에 실제로이 방법이 나에게 도움이되었습니다 (asp.net mvc5)
Michel

1
새로운 이슈를 만들고 수행 한 내용을 자세히 설명 할 수 있습니까? 저를 태그하면 기꺼이 도와 드리겠습니다.
Dan Friedman

1
이 솔루션은 세계화가 필요할 때 가장 좋습니다.
alansiqueira27

26

이것은 나를 위해 일했습니다.

@Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })

12

원시 HTML 사용을 두려워하지 마십시오.

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />

4
그는 어떻게 다시 게시합니까? 날짜는 거의 확실하게 서버에서 다시 구문 분석되지 않습니다.
Robert Koritnik

10
적절한 'name = "StartDate"'를 포함 시키면 모델 바인더가 선택합니다.
naspinski

@ DrJokepu는 MVC3에서 저를 위해 일한 유일한 사람입니다. 그것은 어쨌든 가치 를 만들 TextBoxFor거나 EditorFor형식화 하지 못했습니다 . 내 질문보기 : TextBoxFor 도우미가 날짜와 월을 날짜로 혼합
horgh

10

TL; DR;

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")

신청하는 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]것이 효과가 없었습니다!


설명:

사용하여 모델의 날짜 속성을 표시하기 위해 Html.TextBoxFor:

여기에 이미지 설명을 입력하십시오

모델 클래스의 날짜 속성 :

public DateTime DOB { get; set; }

모델 측에는 다른 것이 필요하지 않습니다.


면도기에서는 다음을 수행합니다.

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")


설명:

input유형 의 html 요소 날짜는 ISO8601date관련하여 형식화되어야합니다 .yyyy-MM-dd

표시된 날짜는 사용자 브라우저의 로캘을 기반으로 형식화되지만 구문 분석 된 값은 항상 yyyy-mm-dd 형식입니다.

내 경험은 언어가 Accept-Language헤더가 아니라 브라우저 표시 언어 또는 OS 시스템 언어에 의해 결정된다는 것 입니다.


4

이 데이터 주석을 적용하여 HTML 5 속성을 사용할 수도 있습니다.

[DataType(DataType.Date)]

그러나 문제는 HTML 5 브라우저에서 브라우저 별 날짜 선택기를 사용할 수 있다는 것입니다. 지원하지 않는 브라우저에는 여전히 자신의 날짜 선택기가 필요합니다. 그런 다음 브라우저뿐만 아니라 날짜 선택기가 표시되지 않도록해야합니다 (Modernizr가 쉽게 수행 할 수 있음). 그렇다면 브라우저를 숨기십시오 (복잡하고 내가 본 믿을만한 방법이 무엇인지 모르겠다).

결국 현재 환경에 Modernizr이 없기 때문에 Alex와 함께 갔지만 브라우저가 이미 지원하지 않는 경우 데이터 선택기를 조건부로만 표시하는 데 사용했을 것입니다.


3

나를 위해 입력 유형을 날짜로 변경 TextboxFor()하기 때문에 를 유지해야했습니다 EditorFor(). Chrome에서 내장 날짜 선택기를 추가하여 이미 사용중인 jQuery 날짜 선택기를 망쳤습니다. 따라서 TextboxFor()AND 를 계속 사용 하여 날짜 만 출력하려면 다음을 수행하십시오.

<tr>
    <td class="Label">@Html.LabelFor(model => model.DeliveryDate)</td>
    @{
        string deliveryDate = Model.DeliveryDate.ToShortDateString();
    }
    <td>@Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) *</td>
    <td style="color: red;">@Html.ValidationMessageFor(model => model.DeliveryDate)</td>
</tr>

1

초기로드시 DisplayFormat 특성이 두 가지 형식으로 작동하지 않았습니다. 대신 EditorTemplate을 만들었습니다.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%@ Import Namespace="System.Web.Mvc.Html" %>
<%=
    Html.TextBox("", Model.ToShortDateString(), new { @class = "date-range" }) %>

1

템플릿 편집기는 표시 목적으로 만 작동합니다. 동일한 편집기 (편집기로 인해 의미가 있음)를 사용하고 31/01/2010과 같은 값을 제공 한 경우 형식이 유효하지 않다는 오류 메시지가 표시됩니다.


1

나는 Globalize를 사용하므로 많은 날짜 형식으로 작업하므로 다음을 사용하십시오.

@Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")

이렇게하면 날짜 형식이 브라우저의 로캘 설정으로 자동 조정됩니다.


1

전시는 문화에 달려 있습니다. 그리고 대부분의 경우 다른 모든 답변은 정확하지만 나에게는 효과가 없었습니다. 문화 문제는 또한 jQuery 날짜 선택기 (연결된 경우)에 다른 문제를 일으킬 수 있습니다.

/다음과 같은 방식으로 형식을 강제 종료 하려면 다음을 수행하십시오.

@Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")

나를 위해 탈출하지 않으면 그것은 08-01-2010예상 대 보여08/01/2010 .

또한 이스케이프되지 않으면 jQuery datepicker는 다른 defaultDate를 선택합니다 May 10, 2012. 제 경우에는이었습니다 .


1

부트 스트랩 날짜 선택기를 사용하는 경우 아래와 같이 data_date_format 속성을 추가 할 수 있습니다.

      @Html.TextBoxFor(m => m.StartDate, new { 
@id = "your-id", @class = "datepicker form-control input-datepicker", placeholder = "dd/mm/yyyy", data_date_format = "dd/mm/yyyy" 
})

0

// datePicker에 datimetime이 2011 년 11 월 24 일 오전 12시 00 분에 표시됩니다.

// 공백으로 나누고 값만 날짜로 설정할 수 있습니다.

스크립트:

    if ($("#StartDate").val() != '') {
        var arrDate = $('#StartDate').val().split(" ");
        $('#StartDate').val(arrDate[0]);
    }

마크 업 :

    <div class="editor-field">
        @Html.LabelFor(model => model.StartDate, "Start Date")
        @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
    </div>

이것이 도움이되기를 바랍니다 ..


7
솔루션이 작동해야합니다. 그러나 겸손한 의견으로는 서버 측에서 발행 된 형식화 된 문자열 날짜에 클라이언트 측에 의존하는 것이 위험 할 수 있습니다. 서버 쪽의 국가 별 설정에 날짜와 시간 사이의 공백이 포함되어 있지 않으면 노출 된 솔루션이 실패합니다.
크로노스

0

물론 Html.EditorFor를 사용할 수 있습니다. 그러나 TextBoxFor를 사용하고 DisplayFormat 속성의 형식을 사용하려면 다음과 같이 사용할 수 있습니다.

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

또는 다음 확장명을 작성하십시오.

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}

0

모델 옆에 추가하십시오.

[DataType(DataType.Date)]
public string dtArrivalDate { get; set; }

0

ASP.NET Core에서 태그 도우미를 사용하는 경우 형식을 ISO 형식으로 지정해야합니다. 그렇게 지정하지 않으면 바운드 입력 데이터가 제대로 표시되지 않고 값없이 mm / dd / yyyy로 표시됩니다.

모델:

[Display(Name = "Hire")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? HireDate { get; set; }

전망:

<input asp-for="Entity.HireDate" class="form-control" />

asp-format 속성을 사용하여보기에서 형식을 지정할 수도 있습니다.

결과 HTML은 다음과 같습니다.

<input class="form-control" type="date" id="Entity_HireDate" 
    name="Entity.HireDate" value="2012-01-01">

0

아래 코드를 사용하여 HH : mm 형식으로 시간을 인쇄 할 수 있습니다 . 제 경우에는 속성 유형이 TimeSpan 이므로 값은 HH : mm : tt 형식 으로 표시되지만 위의 형식으로 표시해야합니다. HH : mm

따라서이 코드를 사용할 수 있습니다 :

@Html.TextBoxFor(x =>x.mTimeFrom, null, new {@Value =Model.mTimeFrom.ToString().Substring(0,5), @class = "form-control success" })

0

를 사용 [DisplayFormat]하지만 MVC4를 사용하지 않는 경우 다음을 사용할 수 있습니다.

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.