@ Html.DisplayFor - DateFormat (“mm / dd / aaaa”)

88

Eu tenho o seguinte código de navalha que desejo ter o mm/dd/yyyyformato de data:

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

Eu tentei várias abordagens diferentes, mas nenhuma delas funciona na minha situação

meu AuditDate é um DateTime?tipo

Eu tentei algo assim e recebi este erro:

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

Informações adicionais: os modelos podem ser usados ​​apenas com acesso a campo, acesso de propriedade, índice de matriz de dimensão única ou expressões de indexador personalizadas de parâmetro único.

Tentei isso:

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

Sem sobrecarga para o método 'ToString' leva 1 argumento

Nick Kahn
fonte

Respostas:

161

Se você usar DisplayFor, terá que definir o formato por meio do DisplayFormatatributo ou usar um modelo de exibição personalizado. (Uma lista completa de predefinições DisplayFormatStringpode ser encontrada aqui .)

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

Ou crie a visualização Views\Shared\DisplayTemplates\DateTime.cshtml:

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

Isso se aplicará a todos os programas DateTime, mesmo aqueles em que você está codificando o tempo também. Se você deseja que ele se aplique apenas a propriedades somente para datas, use Views\Shared\DisplayTemplates\Date.cshtmle o DataTypeatributo em sua propriedade:

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

A opção final é não usar DisplayFore, em vez disso, renderizar a propriedade diretamente:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Chris Pratt
fonte
Eu criei um displayTemplate como você sugeriu e quando copio e colo o código que você tem no modelo, recebo este erroNo overload for method 'ToString' takes 1 arguments
Nick Kahn
3
Acho que deveria ser[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
[DisplayFormat (DataFormatString = "{0: dd / MM / aaaa}")] trabalhou para a Turquia, obrigado
zapoo
@Mac: O que você quer dizer? Eles muito fazer o trabalho, mas talvez não apenas em seu cenário específico. Sem mais informações, não posso dizer quais são suas situações.
Chris Pratt
Se quiser que o editor para usar o formato aswell, adicione ApplyFormatInEditMode = trueà propriedade: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Deveria ser óbvio, mas quando vocês não têm tempo para perder, copiar e colar, essa dica do intellisense pode passar pelo seu nariz como passou pelo meu :)
Heki
19

Se você está simplesmente emitindo o valor dessa propriedade de modelo, não precisa do DisplayForhelper html, apenas chame-o diretamente com a formatação de string adequada .

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

Deve produzir

Audit Date: 1/21/2015

Por último, sua data de auditoria pode ser nula, portanto, você deve fazer a verificação condicional antes de tentar formatar um valor anulável.

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

Procurar no Google o erro que você está obtendo fornece esta resposta , que mostra que o erro é devido ao uso da palavra Model em seus helpers Html. Por exemplo, usando @Html.DisplayFor(Model=>Model.someProperty). Altere-os para usar algo diferente de Model, por exemplo: @Html.DisplayFor(x=>x.someProperty)ou altere a maiúscula Mpara minúsculas mnesses auxiliares.

Tommy
fonte
se eu usasse @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.
Nick Kahn
@AbuHamzah - parece que você ainda está tentando colocar isso no Html.DisplayForauxiliar. Não faça isso. Além disso, você tem certeza de que está gerando o erro nessa linha e não em alguma outra propriedade na qual está tentando usar o DisplayForhelper?
Tommy
Se eu usei @Model..., estou recebendo este erro: 'Model' está em conflito com a declaração System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn
@AbuHamzah Por favor, veja o último parágrafo da minha resposta atualizada.
Tommy
11

Tenho usado esta mudança em meu código:

código antigo:

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

Novo :

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Piotr Mirek
fonte
... e? Isso é uma resposta ou o quê?
Maciej Jureczko
Sim, é simplesmente uma solução para o problema a partir do assunto. Achei que isso poderia ser útil para alguém.
Piotr Mirek
OK, sugiro que você altere "Tenho usado esta alteração no meu código" para algo que afirme especificamente que esta é uma solução.
Maciej Jureczko
Resposta simples e conveniente, funcionou para mim obrigado !!
Scanner de
6

A resposta de @ChrisPratt sobre o uso do modelo de exibição está errada. O código correto para fazer funcionar é:

@model DateTime?

@if (Model.HasValue)
{
    @Convert.ToDateTime(Model).ToString("MM/dd/yyyy")
}

Isso porque o .ToString()for Nullable<DateTime>não aceita o Formatparâmetro .

Leonel Sanches da Silva
fonte
5

Eu implementei algo semelhante desta forma:

  1. Use TextBoxFor para exibir a data no formato necessário e tornar o campo somente leitura .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Dê contorno zero e borda zero para TextBox em css.

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

E ...... Está feito :)

Akshat
fonte
1
Mas por que você faria assim?
CodeCaster
Porque qualquer um dos outros métodos não funcionou para mim e me salvou muito de codificação. Além disso, o resultado final é somente leitura e não tem borda, portanto, não parecia uma caixa de texto.
Akshat
4

Para mim foi o suficiente para usar

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

Você pode usar o atributo [ DisplayFormat ] em seu modelo de visualização, pois deseja aplicar este formato a todo o projeto.

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

Depois de algumas pesquisas, acabei definindo Threado valor de CurrentCulture para ter CultureInfo ("en-US") no método de ação do controlador:

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

Aqui estão algumas outras opções se você quiser ter essa configuração em todas as visualizações.

Sobre o CurrentCulturevalor da propriedade:

O objeto CultureInfo que é retornado por esta propriedade, junto com seus objetos associados, determina o formato padrão para datas, horas, números, valores monetários, a ordem de classificação de texto, convenções de maiúsculas e minúsculas e comparações de strings.

Fonte: MSDN CurrentCulture

Nota: A CurrentCultureconfiguração da propriedade anterior é provavelmente opcional se o controlador já estiver em execução com CultureInfo("en-US")ou semelhante onde está o formato de data "MM/dd/yyyy".

Depois de definir a CurrentCulturepropriedade, adicione o bloco de código para converter a data para o "M/d/yyyy"formato na visualização:

@{  //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

Acima a @shortDateLocalFormatvariável é formatada com ToString("M/d/yyyy")obras. Se ToString("MM/dd/yyyy")for usado, como eu fiz primeiro, você acaba tendo problema zero . Também funciona como recomendado por Tommy ToString("d") . Na verdade, "d"significa “Padrão de data abreviada” e pode ser usado com diferentes formatos de cultura / idioma também.

Eu acho que o bloco de código acima também pode ser substituído por algum método auxiliar legal ou similar.

Por exemplo

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

    @shortDateLocalFormat
}

pode ser usado com esta chamada de ajuda

@DateFormatter(Model.AuditDate)

Update , descobri que existe uma maneira alternativa de fazer a mesma coisa quando o método DateTime.ToString (String, IFormatProvider) é usado. Quando este método é usado, não há necessidade de usar Threada CurrentCulturepropriedade de. O CultureInfo("en-US")é passado como segundo argumento -> IFormatProvider para o DateTime.ToString(String, IFormatProvider)método.

Método auxiliar modificado:

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

    @shortDateLocalFormat
}

.NET Fiddle

Jyrkim
fonte
1

Talvez tente simplesmente

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

também você pode usar muitos tipos de formato de string como .ToString ("dd MMM, yyyy") .ToString ("d") etc.

Wiizl
fonte
recebendo o erro: 'Model' está em conflito com a declaração 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn
se eu o usei @modelnão reconhece
Nick Kahn
@AbuHamzah - Enganei-me, é maiúsculo Mao usar na página HTML, minúsculo mao declarar
Tommy
ainda recebendo o erro, por favor, veja Eu respondo à resposta de Tommy
Nick Kahn
1
No overload for method 'ToString' takes 1 argumentsreclamando quando eu usoToString("mm/dd/yyyy")
Nick Kahn
1

Em vista, substitua isto:

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

Com:

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

Explicação: Se o valor AuditDate não for nulo, ele formatará a data para dd / MM / aaaa, caso contrário, deixe-a como está porque não tem valor.

user2298633
fonte
0

Tive um problema semelhante no meu controlador e aqui está o que funcionou para mim:

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

"DateSigned" é o valor do meu modelo. A linha lê, se o valor do modelo tiver um valor, formate o valor, caso contrário, não mostre nada.

espero que ajude

user3170254
fonte
0

Esta é a melhor maneira de obter uma string de data simples:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
ahmad fatemh
fonte
Esta resposta faz o seguinte: pega a HtmlStringsaída DisplayFor, converte em a String, analisa como a DateTimee formata isso como a String. Desnecessariamente complexo, em minha opinião.
Macaco herege
0

Você pode usar o Convert

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

Veja esta resposta sobre o No overload for method 'ToString' takes 1 argumentserro.

Você não pode formatar um DateTime anulável - você deve usar a propriedade DateTime.Value.

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

Dica: É sempre útil resolver essas coisas em uma classe padrão com o intellisense antes de colocá-las em uma visualização. Nesse caso, você obteria um erro de compilação que seria fácil de detectar em uma classe.

NightOwl888
fonte
se eu usar o código sugerido, recebo este erro'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn