117 votes

Comment rendre un DateTime dans un format spécifique ASP.NET MVC 3?

Si j'ai dans ma classe du modèle d'une propriété de type DateTime comment puis-je l'afficher dans un format spécifique - par exemple dans le format ToLongDateString() retours?

J'ai essayé cette...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

...ce qui déclenche une exception parce que l'expression doit pointer vers un bien ou d'un champ. Et ce...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

...qui ne lance pas d'exception, mais le rendu de la sortie est vide (bien qu' val contient la valeur attendue, comme j'ai pu 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' DisplayFormat de l'attribut et de l' DataFormatString paramètre dans le ViewModel propriétés.

172voto

Darin Dimitrov Points 528142

Vous pouvez décorer votre modèle de vue de la propriété avec l' [DisplayFormat] d'attribut:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
               ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }

et à votre avis:

@Html.EditorFor(x => x.MyDate)

Une autre possibilité que je ne recommande pas est d'utiliser un faiblement typé helper:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())

159voto

NickLarsen Points 9591

Si tout ce que vous voulez faire, c'est afficher la date avec un format spécifique, il suffit d'appeler:

@String.Format(myFormat, Model.MyDateTime)

À l'aide de @Html.DisplayFor(...) est simplement plus de travail, sauf si vous spécifiez un modèle, ou le besoin d'utiliser quelque chose qui est construit sur des modèles, comme l'itération d'une IEnumerable<T>. La création d'un modèle est assez simple, et peut fournir beaucoup de flexibilité. Créez un dossier dans votre dossier de vues pour le régulateur de courant (ou un échange de vues dossier) appelés DisplayTemplates. À l'intérieur de ce dossier, ajouter une vue partielle avec le type de modèle que vous voulez construire le modèle. Dans ce cas, j'ai ajouté /Views/Shared/DisplayTemplates et ajout d'une vue partielle appelés ShortDateTime.cshtml.

@model System.DateTime

@Model.ToShortDateString()

Et maintenant, vous pouvez appeler ce modèle à la ligne suivante:

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")

26voto

odesuk Points 466

Simple sortie formatée à l'intérieur du modèle

@String.Format("{0:d}", model.CreatedOn)

ou dans la boucle foreach

@String.Format("{0:d}", item.CreatedOn)

25voto

Steven Points 479

J'ai utiliser l'approche suivante aux commandes de formatage et l'affichage d'une propriété de date à partir du modèle.

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

Sinon lors du remplissage d'une zone de texte ou un Éditeur que vous pouviez faire comme @Darin suggéré, décoré de l'attribut avec un [DisplayFormat] d'attribut.

9voto

ataddeini Points 3851

Si tous vos DateTime types de sont rendus de la même façon, vous pouvez utiliser une coutume DateTime modèle d'affichage.

Dans votre point de Vue dossier, créez un dossier nommé "DisplayTemplates", soit sous votre contrôleur de vues de dossier ou sous dossier "Shared" (ces travaux similaires aux partiels).

À l'intérieur de créer un fichier nommé DateTime.cshtml qui prend DateTime le @model code et de la façon dont vous voulez rendre votre date:

@model System.DateTime
@Model.ToLongDateString()

Maintenant, vous pouvez simplement utiliser dans vos vues, et il devrait fonctionner:

@Html.DisplayFor(mod => mod.MyDateTime)

Aussi longtemps que vous suivez la convention de l'ajouter à la "DisplayTemplates" du dossier et nommer le fichier en fonction du type de votre affichage, MVC va automatiquement utiliser pour afficher vos valeurs. Cela fonctionne aussi pour l'édition de scénarios à l'aide de "EditorTemplates".

Voici quelques informations sur des modèles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X