Se eu tiver em minha classe de modelo uma propriedade do tipo, DateTime
como posso renderizá-la em um formato específico - por exemplo, no formato que ToLongDateString()
retorna?
Eu tentei isso ...
@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())
... que lança uma exceção porque a expressão deve apontar para uma propriedade ou campo. E isto...
@{var val = item.MyDateTime.ToLongDateString();
Html.DisplayFor(modelItem => val);
}
... que não lança uma exceção, mas a saída renderizada está vazia (embora val
contenha o valor esperado, como pude ver no depurador).
Obrigado por dicas com antecedência!
Editar
ToLongDateString
é apenas um exemplo. O que eu realmente quero usar em vez de ToLongDateString
é um método de extensão personalizado de DateTime
e DateTime?
:
public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
if (dateTime.TimeOfDay == TimeSpan.Zero)
return dateTime.ToString("d");
else
return dateTime.ToString("g");
}
public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
if (dateTime.HasValue)
return dateTime.Value.FormatDateTimeHideMidNight();
else
return "";
}
Portanto, acho que não posso usar o DisplayFormat
atributo e o DataFormatString
parâmetro nas propriedades de ViewModel.
fonte
Você pode decorar a propriedade do seu modelo de visualização com o
[DisplayFormat]
atributo:e na sua opinião:
ou, para exibir o valor,
Outra possibilidade, que não recomendo, é usar um auxiliar de digitação fraca:
fonte
DateTime
(ToLongDateString foi apenas um exemplo), portanto, é improvável que eu possa usarDataFormatString
.@Html.DisplayFor(x => x.MyDateTime)
. @NickLarsen é a razão pela qual os modelos de visualização devem ser usados. No meu exemplo, eu decoro o modelo de visualização com este atributo e uma visualização já está ligada a uma determinada visualização, esse é o seu propósito.Saída formatada simples dentro do modelo
ou no loop foreach
fonte
string.Format
Eu uso a seguinte abordagem para o formato embutido e exibo uma propriedade de data do modelo.
Caso contrário, ao preencher um TextBox ou Editor você poderia fazer como @Darin sugeriu, decorar o atributo com um
[DisplayFormat]
atributo.fonte
Se todos os seus
DateTime
tipos forem renderizados da mesma maneira, você pode usar umDateTime
modelo de exibição personalizado .Na pasta Views, crie uma pasta chamada "DisplayTemplates" na pasta views específicas do controlador ou na pasta "Compartilhada" (funcionam de maneira semelhante às parciais).
Dentro, crie um arquivo chamado
DateTime.cshtml
que assumeDateTime
como o@model
código e como você deseja renderizar sua data:Agora você pode apenas usar isso em suas visualizações e deve funcionar:
Contanto que você siga a convenção de adicioná-lo à pasta "DisplayTemplates" e nomear o arquivo para corresponder ao tipo que você está exibindo, o MVC usará isso automaticamente para exibir seus valores. Isso também funciona para editar cenários usando "EditorTemplates".
Aqui estão mais algumas informações sobre modelos .
fonte
DateTime
. No entanto, tenho algumas propriedades DateTime anuláveis. Tentei criar um segundo arquivo naDisplayTemplates
pasta, chamadoNullableDateTime.cshtml
e dentro:@using MyHelpers @model System.DateTime? @Model.MyCustomExtension()
AquiMyCustomExtension
está um método de extensão emDateTime?
. No entanto, obtém uma exceção quando um DateTime? campo é realmente nulo, informando que o dicionário requer um elemento de modelo do tipoDateTime
que não é nulo. Existe uma maneira de definir um DisplayTemplate para um DateTime anulável?NullableDateTime.cshtml
e usaria a abordagem que @NickLarsen sugeriu e usaria@Html.DisplayFor(m => m.MyDateTime, "NullableDateTime")
.Minha preferência é manter os detalhes de formatação com a visão e não com o modelo. Então, em MVC4 / Razor:
referência de formato datetime: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx
Então eu tenho um selecionador de data JQuery vinculado a ele, e que coloca a data em um formato diferente ... doh!
Parece que preciso definir o formato do selecionador de data com a mesma formatação.
Portanto, estou armazenando a
System.Globalization
formatação em um atributo data- * e coletando-o ao configurar oE aqui está a parte ruim: os formatos de .net e datepicker não combinam, então hackery é necessário:
isso é meio fraco, mas deve abranger muitos casos.
fonte
funciona para mim
fonte
Tive o mesmo problema recentemente.
Eu descobri que simplesmente definir DataType como Date no modelo também funciona (usando a abordagem Code First)
fonte
você pode fazer assim
@item.Date.Value.Tostring("dd-MMM-yy");
fonte
se eu apenas quiser exibir a data em formato curto, eu apenas uso @ Model.date.ToShortDateString () e ele imprime a data em
fonte
Se tudo o que você deseja fazer é mostrar a data com um formato específico, basta ligar:
Isso resultará no seguinte formato,
fonte
isso será exibido em
dd/MM/yyyy
formato em sua VisualizaçãoEm vista:
em vez de
DisplayFor
usar este códigoele também verifica se o valor é nulo na coluna de data; se for verdadeiro, ele exibirá Date is Empty ou a data real formatada da coluna.
A esperança ajuda alguém.
fonte
fonte
Em MVC5 eu usaria, se o seu modelo é o datetime
Ou se o seu modelo contém a propriedade da data e hora
Aqui está o significado oficial dos formatos:
https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
fonte
Apenas Visualizar Arquivo Ajustar assim. Você pode tentar isso.
item.transdate
são seusDateTime
dados de tipo.fonte