Yalnızca TextBoxFor () konumundan tarih


271

TextBoxFor <,> (ifade, htmlAttributes) kullanarak bir metin kutusuna bir DateTime yalnızca tarih bölümünü görüntülemekte sorun yaşıyorum.

Model Linq2SQL tabanlı, alan SQL ve Entity modelinde bir DateTime.

Başarısız oldu:

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

Bu hile amortismana uğramış gibi görünüyor, htmlAttribute nesnesindeki herhangi bir dize değeri yok sayılıyor.

Başarısız oldu:

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

Ayrıntılar / düzenleme görünümünde yalnızca tarih bölümünü "00:00:00" bölümü olmadan depolamak ve görüntülemek istiyorum.

Yanıtlar:


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

Sonra:

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

Evet, şimdi EditorFor yardımcı olduğu için ve MVC2 sonlandırıldı, çözümünüz yol
Kronos

66
Ancak artık Html.EditorFor () yardımcısında belirtildiği gibi @ class = "datepicker" özniteliklerimi göz ardı ettiği için Jquery UI datepicker bu girdiye uygulanamıyor. Dolayısıyla bu metin kutusu artık doğru biçimlendiriliyor, ancak tıklandığında bir tarih seçici başlatmıyor. Yani bir şey düzeltildi ve başka bir şey kırıldı.
Aaron

5
Bu çözümle uyumlu olarak görüntülenmesini nasıl sağlayabilirim, aynı zamanda Html.TextboxFor () ile olduğu gibi datepicker'ı başlatmasını da sağlayabilirim
Aaron

49
Ben MVC4 Razor sözdizimi kullanıyorum, tarih alanı olarak işlenir @Html.EditorFor(m => m.IssueDate)ve modeldeki biçimlendirme olarak uygulanır [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]ancak tarih hala olarak gösterilir01/01/0001 12:00:00 AM
bjan

4
@Aaron htmlAttributes parametresine sahip olan EditorFor'un aşırı yüklenmesi yok. Muhtemelen htmlAttributes ilettiğinizi düşünerek viewTemplate parametresine veya başka bir şeye geçiriyorsunuz. Bu Editorfor'un dezavantajıdır. TextBoxFor, DisplayFormat ek açıklamasını yoksayar. Alexeyss'in çözümü, bu sorunu çözmek için biçimi farklı uygular.
AaronLS

362

MVC4 , TextBoxFordize biçimi parametresi alan yeni bir aşırı yük ekleyerek bu sorunu çözdü . Şimdi bunu kolayca yapabilirsiniz:

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

Ayrıca, html özniteliklerini alan bir aşırı yük var, böylece CSS sınıfını ayarlayabilir, tarih belirleyicileri vb. Ayarlayabilirsiniz:

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

40
Bu MVC4 için en iyi cevap - jquery UI datepicker kullanmamı sağlar ve bunu yaparak seçimi formatlar:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb

3
Teşekkür ederim! Ancak TextBoxFor'un modelin [DisplayFormat]niteliğini görmezden geldiği bir hata gibi görünüyor . TextBoxFor'da en azından bir geçersiz kılma olduğuna sevindim (ve beni uyarmışsınız).
Neil Laslett

7
Ben böyle ayarlayın @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")ama httpPost MM.dd.yyyy gibi veri almak. Bunu nasıl çözebilirim?
user007

3
Sana bir bira alıyorum! Bu küçük sorun, bu cevabı bulana kadar bana böyle bir baş ağrısına neden oldu.
JoshYates1980

3
Bilginize : Birçok tarayıcı ve input[type=date]teknik özellik "{0:yyyy-MM-dd}"format gerektirir .
KyleMit

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

5
EditorFor çözümü, id veya sınıf gibi diğer HTML niteliklerini geçersiz kılmanız gerektiği durumlar dışında çalışır. Bu harika bir çözüm. V'nin büyük harf olması gerektiği garip.
Ben Mills

1
Boş değeri güvenli bir şekilde işlemek için Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy") yapabilirsiniz. Model.EndDate değeri null ise, varsayılan Datetime değeri görüntülenir.

15
Boş değerlerle ilgili olarak, DateTime'ın varsayılan değeri 1 Ocak 1901'dir, bence kullanmak daha iyi olacaktır@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan

1
@Spikolynn, bu benim için ikinci bir 'Değer' özniteliği oluşturmadı (MVC3 / ustura şablonu).
Doug S

2
ÖNEMLİ: "Değer" de "V" Kapitalini kontrol edin, küçük harf yapmayacak!
Tejasvi Hegde

48

Veya türlenmemiş yardımcıları kullanın:

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

22
Hafif varyasyon@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman

ASPX görüntüleme motoru yerine Razor kullanıyor, ancak ikisi de MVC 4'te çalışıyor ve bir sözdiziminden diğerine geçmek önemsiz. Razor'da yayınladım çünkü kullandığım ve test ettiğim şey bu. Dediğim gibi, bu bir varyasyon.
Dan Friedman

1
@ Dan Friedman: Bu benim için doğru yoldu! Bir editör şablonuyla çalışırdım, ama sonra kendi html'imi oluşturmak ve ayrıca tüm doğrulama mesajlarını ve tüm Bootstrap niteliklerini dahil etmek zorunda kaldım, bu yüzden bu benim için gerçekten yol (asp.net mvc5)
Michel

1
Yeni bir sorun yaratabilir ve yaptıklarınızı ayrıntılandırabilir misiniz? Beni etiketle ve yardım etmekten mutluluk duyarım.
Dan Friedman

1
Küreselleşmeye ihtiyacınız olduğunda bu çözüm en iyisidir.
alansiqueira27

26

Bu benim için çalıştı.

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

12

Ham HTML kullanmaktan korkmayın.

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

4
O zaman nasıl yayınlayacaktı? Çünkü tarih neredeyse kesinlikle sunucuda ayrıştırılmaz.
Robert Koritnik

10
Uygun 'name = "StartDate"' ifadesini eklediğiniz sürece, model bağlayıcı onu alır.
naspinski

@ DrJokepu MVC3 üzerinde benim için çalışan tek şey. Yani ben bir şekilde değer yapamadım TextBoxForya da EditorForbiçimlendiremedim Sorumu bakınız: TextBoxFor yardımcı karışımları gün ve ay tarihleri
horgh

10

TL; DR;

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

Başvuru [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]benim için işe yaramadı!


Açıklama:

Modelinizin bir date özelliğini görüntülemek için Html.TextBoxFor:

resim açıklamasını buraya girin

Model sınıfınızın date özelliği:

public DateTime DOB { get; set; }

Model tarafında başka bir şeye gerek yoktur.


Razor'da şunları yaparsınız:

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


Açıklama:

Bir html tarihi inputtip unsuru dateaçısından biçimlendirilmiş olması gerekir ISO8601 olduğunu:yyyy-MM-dd

Görüntülenen tarih, kullanıcının tarayıcısının yerel ayarına göre biçimlendirilir, ancak ayrıştırılan değer her zaman yyyy-aa-gg olarak biçimlendirilir.

Deneyimlerim, dilin Accept-Languagebaşlık tarafından değil, tarayıcı görüntüleme dili veya işletim sistemi sistem dili tarafından belirlenmesidir.


4

Bu veri ek açıklamasını uygulayarak HTML 5 özelliklerini de kullanabilirsiniz:

[DataType(DataType.Date)]

Ancak sorun HTML 5 tarayıcıları için tarayıcıya özel bir tarih seçiciyi etkinleştirmektir. Hala desteksiz tarayıcılar için kendi tarih seçicinize ihtiyacınız var ve ardından tarih seçicinizin bir tarayıcıya ek olarak görünmediğinden emin olmalısınız (Modernizr bunu kolayca yapabilir) veya varsa tarayıcını gizleyin (karmaşık ve ben gördüğüm yöntemlerin ne kadar güvenilir olduğunu bilmiyorum).

Sonunda Alex'le gittim çünkü mevcut ortamım Modernizr'e sahip değildi, ama eğer olsaydı, bunu koşullu olarak sadece tarayıcı zaten desteklemiyorsa veri seçicimi göstermek için kullanırdım.


3

Benim için saklamam gerekiyordu TextboxFor()çünkü kullanım EditorFor()girdi tipini bugüne kadar değiştiriyor. Chrome'da, zaten kullanmakta olduğum jQuery tarih seçiciyi bozan yerleşik bir tarih seçici ekler. Bu nedenle, TextboxFor()VE işlevini yalnızca tarih çıktısını almaya devam etmek için şunları yapabilirsiniz:

<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 özniteliği ilk yükleme sırasında her iki biçimde de çalışmadı. Bunun yerine bir EditorTemplate oluşturdum:

<%@ 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

Şablon Düzenleyici yalnızca görüntüleme amacıyla çalışır. Aynı düzenleyiciyi kullanırsanız (bu bir düzenleyici olduğu için anlamlıdır) ve 31/01/2010 gibi bir değer sağladıysanız - biçimin geçersiz olduğunu belirten bir hata iletisi alırsınız.


1

Globalize kullanıyorum, bu yüzden birçok tarih formatıyla çalışıyorum, bu yüzden aşağıdakileri kullanın:

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

Bu, tarih biçimini otomatik olarak tarayıcının yerel ayarlarına göre ayarlar.


1

Ekranın kültüre bağlı olacağını unutmayın. Ve çoğu durumda diğer tüm cevaplar doğru olsa da, benim için işe yaramadı. Kültür sorunu ayrıca eklenirse jQuery tarih seçici ile farklı sorunlara neden olacaktır.

Biçim çıkışını /aşağıdaki şekilde zorlamak istiyorsanız :

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

Benim için 08-01-2010kaçmazsa, beklenen ile karşılaştırıldığında gösterir 08/01/2010.

Ayrıca kaçmazsa jQuery tarih seçici farklı defaultDate seçecektir, benim durumumda oldu May 10, 2012.


1

Bootstrap tarih seçici kullanıyorsanız, aşağıdaki gibi data_date_format niteliğini ekleyebilirsiniz .

      @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

// tarihte datimetime görüntüleniyorSeçici 11/24/2011 12:00:00 AM

// bunu boşluğa bölebilir ve değeri yalnızca tarihe ayarlayabilirsiniz

Senaryo:

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

İşaretleme:

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

Umarım bu yardımcı olur ..


7
Çözümünüz işe yarayacak. Ama benim düşünceme göre, sunucu tarafında verilen biçimlendirilmiş dize tarihinde müşteri tarafında güvenmek tehlikeli olabilir. Sunucu tarafındaki bölgesel ayarlar tarih ve saat arasında boşluk içermiyorsa, açık çözümünüz başarısız olur.
Kronos

0

Tabii Html.EditorFor kullanabilirsiniz. Ancak TextBoxFor ve DisplayFormat özniteliğindeki biçimi kullanmak istiyorsanız, bunu şu şekilde kullanabilirsiniz:

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

veya bir sonraki uzantı oluştur:

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

Sadece modelinizin yanına ekleyin.

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

0

ASP.NET Core'da etiket yardımcılarını kullanırken, biçimin ISO biçiminde belirtilmesi gerekir. Bu şekilde belirtilmezse, bağlı giriş verileri düzgün görüntülenmez ve hiçbir değeri olmayan mm / gg / yyyy olarak gösterilir.

Model:

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

Görünüm:

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

Biçim, asp biçimi özniteliği kullanılarak görünümde de belirtilebilir.

Ortaya çıkan HTML aşağıdaki gibi görünecektir:

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

0

HH: mm formatında zamanı yazdırmak için aşağıdaki kodu kullanabilirsiniz , Benim durumumda Özellik türü TimeSpan Yani değer HH: mm: tt formatında geliyor, ancak yukarıdaki formatta göstermeliyim yani. SS: dd

Böylece bu kodu kullanabilirsiniz:

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

0

Eğer kullanmakta ısrar ediyorsanız [DisplayFormat], ancak MVC4 kullanmıyorsanız, bunu kullanabilirsiniz:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.