web-dev-qa-db-fra.com

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

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.

115
Slauma

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")
158
Nick Larsen

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())
170
Darin Dimitrov

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)
26
odesuk

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].

23
Steven

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 .

9
ataddeini

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.

7
philn5d

travaille pour moi 

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
2
numerah

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; }
2
Vladislav Bolshakov

vous pouvez faire comme ceci @item.Date.Value.Tostring("dd-MMM-yy");

1
Saurabh Solanki

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
0
Kailas Mane

si je veux juste afficher la date au format court, j’utilise simplement @ Model.date.ToShortDateString () et il affiche la date 

0
Marcianin

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

0
Jose Ortega
@{
  string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
  @datein
}
0
wesley7

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.

0
stom