Atribuir formato de DateTime com anotações de dados?

99

Eu tenho este atributo em meu modelo de visualização:

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

Se eu quiser exibir a data ou preencher uma caixa de texto com a data, tenho o seguinte:

<%: Model.StartDate %>

<%: Html.TextBoxFor(m => m.StartDate) %>

Sempre que a data é exibida, ela é exibida como: 01/01/2011 12:00:00 AM

Mas eu gostaria de exibir apenas 01/01/2011

Existe uma maneira de aplicar um formato de exibição com anotações de dados? Não quero ter que ir a cada instância onde exibo uma data e adicionar algum código para formatá-la.

Steven
fonte

Respostas:

151

Tente marcá-lo com:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
David Fox
fonte
Acabei de tentar fazer isso, ele ainda exibe a hora no TextBox e quando é apenas exibido na página.
Steven,
3
@Steven: Você pode tentar remover [DataType(DataType.DateTime)]se ainda não o fez?
David Fox,
8
DisplayFormatfunciona apenas com ajudantes EditorFore DisplayFor.
Ε Г И І И О
1
Ótima resposta - estava faltando o parâmetro "ApplyFormatInEditMode".
CodeHxr
5
Consegui resolver isso pelo parâmetro de formato em Html.TextBoxFor. Ao definir como, @Html.TextBoxFor(model => model.YOUR_DATE, "{0:MM/dd/yyyy}")consegui obter apenas a data a ser exibida. Encontrado aqui [ stackoverflow.com/a/14529347/2938775] .
Caffeinius
44

Você tentou isso?

[DataType(DataType.Date)]
rk1962
fonte
2
Isso também habilitará o suporte ao seletor de data HTML5, se o navegador for compatível.
AaronLS
24

No mvc 4, você pode fazer isso facilmente como seguir usando TextBoxFor..

@Html.TextBoxFor(m => m.StartDate, "{0:MM/dd/yyyy}", new { @class = "form-control default-date-picker" })

Então, você não precisa usar nenhuma anotação de dados no modelo ou classe de modelo de vista

Hasib Hasan Arnab
fonte
sim, essas DataAnnotations funcionam muito bem para os ajudantes EditorFor, mas, ao renderizar uma grade personalizada com um IEnumerable (Of Entity), você tem que usar o .TextBoxFor e esse era o meu problema. Obrigado
bkwdesign
22

Se o seu campo de dados já for um tipo de dados DateTime, você não precisa usar [DataType(DataType.Date)]para a anotação; Apenas use:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]

no jQuery, use datepicker para seu calendário

    $(document).ready(function () {
        $('#StartDate').datepicker();
    });

em seu HTML, use EditorForauxiliar:

    @Html.EditorFor(model => model.StartDate)
Toddt
fonte
"Se o seu campo de dados já for um tipo de dados DateTime, você não precisa usar [DataType(DataType.Date)]" => isso foi útil
Hassan Tareq
Mas para a API da web, o formato de exibição não é obrigatório DataFormatString = "{0:MM/dd/yyyy}"(não recebi nenhum 400, mesmo que o corpo da solicitação tivesse outro formato, ou seja {"dob":"31/12/1990"})
Hassan Tareq
18

Aplique DataAnnotation como:

[DisplayFormat(DataFormatString = "{0:MMM dd, yyyy}")]
Chirag
fonte
10

Use isso, mas é uma solução completa:

[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
Renatto Machado
fonte
4

Use EditorFor em vez de TextBoxFor

conluiobdbh
fonte
1

Isso funciona para mim

[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
FelixAVeras
fonte
0

defina sua propriedade usando o código abaixo no momento da criação do modelo, acho que seu problema será resolvido ... e o tempo não aparece no banco de dados. você não precisa adicionar nenhuma anotação.

private DateTime? dob;
        public DateTime? DOB
        {
            get
            {
                if (dob != null)
                {
                    return dob.Value.Date;
                }
                else
                {
                    return null;
                }

            }
            set { dob = value; }
        }

fonte