web-dev-qa-db-fra.com

@ Html.DisplayFor - DateFormat ("mm / jj / aaaa")

J'ai le code de rasoir suivant pour lequel je veux avoir le format de date mm/dd/yyyy:

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

J'ai essayé plusieurs approches différentes, mais aucune de ces approches ne fonctionne dans ma situation.

mon AuditDate est un type DateTime?

J'ai essayé quelque chose comme ça et j'ai cette erreur:

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

Informations complémentaires: les modèles ne peuvent être utilisés qu'avec les expressions d'accès aux champs, d'accès aux propriétés, d'index de tableaux à une dimension ou d'indexeur personnalisé à un paramètre.

J'ai essayé ceci:

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

Aucune surcharge pour la méthode 'ToString' prend 1 argument

70
Nick Kahn

Si vous utilisez DisplayFor, vous devez définir le format via l'attribut DisplayFormat ou utiliser un modèle d'affichage personnalisé. (Une liste complète de DisplayFormatString 'peut être trouvée ici .)

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

Ou créez la vue Views\Shared\DisplayTemplates\DateTime.cshtml:

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

Cela s'appliquera à tous les DateTimes, même ceux où vous encodez l'heure également. Si vous souhaitez qu'il s'applique uniquement aux propriétés de date uniquement, utilisez Views\Shared\DisplayTemplates\Date.cshtml et l'attribut DataType de votre propriété:

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

La dernière option consiste à ne pas utiliser DisplayFor et à rendre la propriété directement:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
131
Chris Pratt

Si vous exportez simplement la valeur de cette propriété de modèle, vous n'avez pas besoin de l'aide DisplayFor html, appelez-la directement avec le format de chaîne approprié .

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

Devrait sortie

Audit Date: 1/21/2015

Enfin, votre date d'audit peut être nulle. Vous devez donc procéder à la vérification conditionnelle avant de tenter de formater une valeur nullable.

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

Googler l'erreur que vous obtenez fournit cette réponse , ce qui montre que l'erreur provient de l'utilisation du modèle Word dans vos aides HTML. Par exemple, utilisez @Html.DisplayFor(Model=>Model.someProperty). Changez-les pour utiliser autre chose que Model, par exemple: @Html.DisplayFor(x=>x.someProperty) ou changez la majuscule M en minuscule m dans ces assistants.

18
Tommy

@ ChrisPratt a mal répondu à l'utilisation de Display Template. Le code correct pour le faire fonctionner est:

@model DateTime?

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

En effet, .ToString() POUR Nullable<DateTime> N'ACCEPTE PAS LE PARAMÈTRE Format .

5

J'ai implémenté la même chose de cette façon:

  1. Utilisez TextBoxFor pour afficher la date au format requis et définir le champ en lecture seule .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Donnez contour zéro et bordure zéro à TextBox en css.

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

Et ...... C'est fait :)

4
Akshat

Pour moi, il suffisait d'utiliser

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

Après quelques recherches et j’ai fini par définir Thread ' CurrentCulture valeur à avoir CultureInfo ("en-US") dans la méthode d'action du contrôleur:

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

Voici quelques autres options si vous voulez avoir ce réglage sur chaque vue.

A propos de la valeur de la propriété CurrentCulture:

L'objet CultureInfo renvoyé par cette propriété, ainsi que ses objets associés, déterminent le format par défaut des dates, heures, chiffres, valeurs monétaires, l'ordre de tri du texte, les conventions de casse et les comparaisons de chaînes.

Source: MSDN CurrentCulture

Remarque: Le paramètre de propriété CurrentCulture précédent est probablement facultatif si le contrôleur est déjà en cours d'exécution avec CultureInfo("en-US") ou similaire, lorsque le format de date est "MM/dd/yyyy" .

Après avoir défini la propriété CurrentCulture, ajoutez un bloc de code pour convertir la date au format "M/d/yyyy" dans la vue:

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

Au-dessus de la variable @shortDateLocalFormat est formatée avec ToString("M/d/yyyy"). Si ToString("MM/dd/yyyy") est utilisé, comme je l'ai fait en premier, vous finissez par avoir premier zéro . Aussi, comme recommandé par TommyToString("d") fonctionne également. En fait, "d" signifie "Modèle de date courte" et peut également être utilisé avec différents formats de culture/langue.

Je suppose que le bloc de code ci-dessus peut également être remplacé par un méthode d'assistance cool ou similaire.

Par exemple

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

    @shortDateLocalFormat
}

peut être utilisé avec cet appel d'assistance

@DateFormatter(Model.AuditDate)

Mise à jour , j'ai découvert qu'il existe un autre moyen de faire la même chose lorsque DateTime.ToString (String, IFormatProvider) est la méthode utilisé. Lorsque cette méthode est utilisée, il n’est pas nécessaire d’utiliser la propriété Thread ’s CurrentCulture. La CultureInfo("en-US") est transmise en tant que deuxième argument -> IFormatProvider à la méthode DateTime.ToString(String, IFormatProvider).

Méthode d'assistance modifiée:

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

    @shortDateLocalFormat
}

. NET Fiddle

2
jyrkim

J'ai utilisé ce changement dans mon code:

ancien code:

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

nouveau :

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
2
Piotr Mirek

Vous pouvez utiliser Convert

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

Peut-être essayer simplement

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

vous pouvez également utiliser de nombreux types de format de chaîne tels que .ToString ("jj MMM, aaaa") .ToString ("d"), etc.

0
Wiizl

Dans la vue Remplacez ceci:

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

Avec:

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

Explanation: Si la valeur AuditDate n'est pas null, la date sera alors formatée en jj/mm/aaaa, sinon, laissez-la en l'état car elle n'a pas de valeur.

0
user2298633

C'est le meilleur moyen d'obtenir une chaîne de date simple:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
0
ahmad fatemh

J'ai eu un problème similaire sur mon contrôleur et voici ce qui a fonctionné pour moi:

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

"DateSigned" est la valeur de mon modèle. La ligne est lue. Si la valeur du modèle a une valeur, formatez-la, sinon rien ne s'affiche.

J'espère que ça t'as aidé

0
user3170254