Si j'ai dans ma classe de modèle une propriété de type DateTime
, comment puis-je la restituer dans un format spécifique - par exemple dans le format que ToLongDateString()
renvoie?
J'ai essayé ça ...
@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())
... qui lève une exception parce que l'expression doit pointer sur une propriété ou un champ. Et ça...
@{var val = item.MyDateTime.ToLongDateString();
Html.DisplayFor(modelItem => val);
}
... qui ne lève pas d'exception, mais la sortie rendue est vide (bien que val
contient la valeur attendue, comme je pouvais le voir dans le débogueur).
Merci pour les conseils à l'avance!
Modifier
ToLongDateString
n'est qu'un exemple. Ce que je veux réellement utiliser à la place de ToLongDateString
est une méthode d'extension personnalisée de DateTime
et 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 "";
}
Donc, je pense que je ne peux pas utiliser l'attribut DisplayFormat
et le paramètre DataFormatString
sur les propriétés ViewModel.
Si vous souhaitez simplement afficher la date avec un format spécifique, appelez simplement:
@String.Format(myFormat, Model.MyDateTime)
Utiliser @Html.DisplayFor(...)
est un travail supplémentaire, sauf si vous spécifiez un modèle ou devez utiliser quelque chose qui repose sur des modèles, comme l'itération d'un IEnumerable<T>
. Créer un modèle est assez simple et peut également apporter beaucoup de flexibilité. Créez un dossier dans votre dossier de vues pour le contrôleur actuel (ou dossier de vues partagées) appelé DisplayTemplates
. Dans ce dossier, ajoutez une vue partielle avec le type de modèle pour lequel vous souhaitez créer le modèle. Dans ce cas, j'ai ajouté /Views/Shared/DisplayTemplates
et ajouté une vue partielle appelée ShortDateTime.cshtml
.
@model System.DateTime
@Model.ToShortDateString()
Et maintenant, vous pouvez appeler ce modèle avec la ligne suivante:
@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")
Vous pouvez décorer votre propriété de modèle de vue avec l'attribut [DisplayFormat]
:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",
ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }
et à votre avis:
@Html.EditorFor(x => x.MyDate)
ou, pour afficher la valeur,
@Html.DisplayFor(x => x.MyDate)
Une autre possibilité, que je ne recommande pas, est d'utiliser un assistant faiblement typé:
@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())
Sortie formatée simple à l'intérieur du modèle
@String.Format("{0:d}", model.CreatedOn)
ou dans la boucle foreach
@String.Format("{0:d}", item.CreatedOn)
J'utilise l'approche suivante pour formater en ligne et afficher une propriété de date à partir du modèle.
@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")
Sinon, lorsque vous remplissez une zone de texte ou un éditeur, vous pouvez faire comme @Darin l'a suggéré, décoré l'attribut d'un attribut [DisplayFormat]
.
Si tous vos types DateTime
sont rendus de la même manière, vous pouvez utiliser un modèle d’affichage DateTime
personnalisé.
Dans votre dossier Vues, créez un dossier nommé "DisplayTemplates", soit sous le dossier des vues spécifiques à votre contrôleur, soit sous le dossier "Partagé" (ils fonctionnent comme des partiels).
À l'intérieur, créez un fichier nommé DateTime.cshtml
qui prend DateTime
comme @model
et indiquez comment vous souhaitez afficher votre date:
@model System.DateTime
@Model.ToLongDateString()
Maintenant, vous pouvez simplement utiliser ceci dans vos vues et cela devrait fonctionner:
@Html.DisplayFor(mod => mod.MyDateTime)
Tant que vous suivez la convention consistant à l'ajouter au dossier "DisplayTemplates" et à nommer le fichier en fonction du type que vous affichez, MVC l'utilisera automatiquement pour afficher vos valeurs. Cela fonctionne également pour l'édition de scénarios à l'aide de "EditorTemplates".
Voici quelques informations supplémentaires sur les modèles .
Ma préférence est de conserver les détails de mise en forme avec la vue et non le modèle. Donc, dans MVC4/Razor:
@Html.TextBoxFor(model => model.DateTime, "{0:d}");
format de date/heure: http://msdn.Microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx
Ensuite, j'ai un datepicker JQuery lié à celui-ci, et qui met la date dans un format différent ... doh!
On dirait que je dois définir le format du datepicker sur le même format.
Je stocke donc le formatage System.Globalization
dans un attribut data- * et le collecte lors de la configuration du
@Html.TextBoxFor(
model => model.DateTime.Date,
"{0:d}",
new
{
@class = "datePicker",
@data_date_format=System.Globalization.CultureInfo
.CurrentUICulture.DateTimeFormat.ShortDatePattern
}));
Et voici la partie fastidieuse: les formats de .net et datepicker ne correspondent pas, un hackery est donc nécessaire:
$('.datePicker').each(function(){
$(this).datepicker({
dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
});
});
c'est un peu faible, mais devrait couvrir beaucoup de cas.
travaille pour moi
<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
A eu le même problème récemment.
J'ai découvert que la simple définition de DataType as Date dans le modèle fonctionne également (avec l'approche Code First)
[DataType(DataType.Date)]
public DateTime Added { get; set; }
vous pouvez faire comme ceci @item.Date.Value.Tostring("dd-MMM-yy");
Si vous souhaitez simplement afficher la date dans un format spécifique, appelez simplement:
@Model.LeadDate.ToString("dd-MMM-yyyy")
@Model.LeadDate.ToString("MM/dd/yy")
Il en résultera le format suivant,
26-Apr-2013
04/26/13
si je veux juste afficher la date au format court, j’utilise simplement @ Model.date.ToShortDateString () et il affiche la date
Dans MVC5, je l’utiliserais, si votre modèle est datetime
string dt = Model.ToString("dd/MM/yyy");
Ou si votre modèle contient la propriété du datetime
string dt = Model.dateinModel.ToString("dd/MM/yyy");
Voici la signification officielle des formats:
https://msdn.Microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
@{
string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");
@datein
}
cela s'affichera au format dd/MM/yyyy
dans votre vue
En vue:
au lieu de DisplayFor
, utilisez ce code
<td>
@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")
</td
il vérifie également si la valeur est null dans la colonne de date. Si la valeur est true, la date est vide et la date de mise en forme de la colonne.
Hope aide quelqu'un.