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

88

J'ai le code de rasoir suivant que je veux avoir au mm/dd/yyyyformat de date:

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 DateTime?type

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

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

Informations supplémentaires: Les modèles ne peuvent être utilisés qu'avec l'accès aux champs, l'accès aux propriétés, l'index de tableau à une dimension ou les expressions d'indexation personnalisées à paramètre unique.

J'ai essayé ceci:

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

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

Nick Kahn
la source

Réponses:

161

Si vous utilisez DisplayFor, vous devez définir le format via l' DisplayFormatattribut ou utiliser un modèle d'affichage personnalisé. (Une liste complète des préréglages DisplayFormatStringpeut ê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 également l'heure. Si vous souhaitez qu'il s'applique uniquement aux propriétés de date uniquement, utilisez Views\Shared\DisplayTemplates\Date.cshtmlet l' DataTypeattribut sur votre propriété:

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

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

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Chris Pratt
la source
J'ai créé un displayTemplate comme vous l'avez suggéré et lorsque je copie et colle le code que vous avez dans le modèle, j'obtiens cette erreurNo overload for method 'ToString' takes 1 arguments
Nick Kahn
3
Je pense que cela devrait être[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] a travaillé pour la Turquie merci
zapoo le
@Mac: Comment voulez-vous dire? Ils très bien faire le travail, mais peut - être tout simplement pas dans votre scénario spécifique. Sans plus d'informations, je ne peux pas dire quelle est votre situation.
Chris Pratt
Si vous voulez que l'éditeur utilise le format aswell, ajouter ApplyFormatInEditMode = trueà la propriété: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Cela devrait être évident, mais quand vous n'avez pas de temps à perdre, copiez-collez cet indice d'intellisense pourrait passer votre nez comme le mien :)
Heki
19

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

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

Devrait sortir

Audit Date: 1/21/2015

Enfin, votre date d'audit peut être nulle, vous devez donc effectuer la vérification conditionnelle avant d'essayer de mettre en forme une valeur Nullable.

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

Googler l'erreur que vous obtenez fournit cette réponse , qui montre que l'erreur provient de l'utilisation du mot Modèle dans vos helpers Html. Par exemple, en utilisant @Html.DisplayFor(Model=>Model.someProperty). Modifiez-les pour utiliser autre chose que Model, par exemple: @Html.DisplayFor(x=>x.someProperty)ou changez la majuscule Men minuscule mdans ces helpers.

Tommy
la source
si j'ai utilisé @Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Nick Kahn
@AbuHamzah - on dirait que vous essayez toujours de mettre cela dans l' Html.DisplayForaide. Ne fais pas ça. De plus, êtes-vous sûr que cela lance l'erreur sur cette ligne et non sur une autre propriété sur laquelle vous essayez d'utiliser l' DisplayForassistant?
Tommy
Si j'ai utilisé, @Model...j'obtiens cette erreur: 'Model' est en conflit avec la déclaration System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn
@AbuHamzah Veuillez voir le dernier paragraphe de ma réponse mise à jour.
Tommy
11

J'utilise 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>
Piotr Mirek
la source
... et? Est-ce une réponse ou quoi?
Maciej Jureczko
Oui, c'est simplement une solution au problème du sujet. J'ai pensé que cela pourrait être utile à quelqu'un.
Piotr Mirek
OK, je vous suggère de changer "J'ai utilisé ce changement dans mon code" en quelque chose indiquant spécifiquement que c'est une solution.
Maciej Jureczko
Réponse simple et pratique, a fonctionné pour moi merci !!
Scanner
6

La réponse de @ ChrisPratt sur l'utilisation du modèle d'affichage est fausse. Le code correct pour le faire fonctionner est:

@model DateTime?

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

C'est parce que .ToString()for Nullable<DateTime>n'accepte pas le Formatparamètre .

Leonel Sanches da Silva
la source
5

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

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

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

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

Et ... c'est fait :)

Akshat
la source
1
Mais pourquoi le feriez-vous comme ça?
CodeCaster
Parce qu'aucune des autres méthodes n'a fonctionné pour moi et cela m'a sauvé beaucoup de codage. De plus, le résultat final est en lecture seule et n'a pas de bordure, il ne ressemblait donc pas à une zone de texte.
Akshat
4

Pour moi, il suffisait d'utiliser

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

Vous pouvez utiliser l' attribut [ DisplayFormat ] sur votre modèle de vue car vous souhaitez appliquer ce format à l'ensemble du projet.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
Aung San Myint
la source
2

Après quelques fouilles et j'ai fini par définir Threadla valeur CurrentCulture pour 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 souhaitez avoir ce paramètre sur chaque vue.

À propos de la CurrentCulturevaleur de la propriété:

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

Source: MSDN CurrentCulture

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

Après avoir défini la CurrentCulturepropriété, ajoutez un bloc de code pour convertir la date au "M/d/yyyy"format 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, la @shortDateLocalFormatvariable est formatée avec des ToString("M/d/yyyy")œuvres. Si ToString("MM/dd/yyyy")est utilisé, comme je l'ai fait d'abord, vous finissez par avoir un problème majeur . Comme recommandé par Tommy ToString("d") fonctionne également. En fait, cela "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 une 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 la méthode DateTime.ToString (String, IFormatProvider) est utilisée. Lorsque cette méthode est utilisée, il n'est pas nécessaire d'utiliser Threadla CurrentCulturepropriété de. Le CultureInfo("en-US")est passé comme deuxième argument -> IFormatProvider à la DateTime.ToString(String, IFormatProvider)méthode.

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

jyrkim
la source
1

Essayez peut-être simplement

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

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

Wiizl
la source
obtenir l'erreur: 'Model' est en conflit avec la déclaration 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn
si je l'ai utilisé, @modelil ne reconnaît pas
Nick Kahn
@AbuHamzah - Je me suis trompé, c'est une majuscule Mlors de l'utilisation dans la page HTML, en minuscules mlors de la déclaration.
Tommy
toujours l'erreur, s'il vous plaît voir Je réponds à la réponse de Tommy
Nick Kahn
1
No overload for method 'ToString' takes 1 argumentsse plaindre quand j'utiliseToString("mm/dd/yyyy")
Nick Kahn
1

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)}

Explication: Si la valeur AuditDate n'est pas nulle, elle formatera la date en jj / MM / aaaa, sinon laissez-la telle quelle car elle n'a pas de valeur.

user2298633
la source
0

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 lit, si la valeur du modèle a une valeur, formatez la valeur, sinon n'affichez rien.

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

utilisateur3170254
la source
0

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

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
ahmad fatemh
la source
Voici ce que fait cette réponse: prend la HtmlStringsortie par DisplayFor, la convertit en a String, l'analyse comme a DateTime, puis la formate comme un String. Inutilement complexe, à mon avis.
Heretic Monkey
0

Vous pouvez utiliser Convert

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

Voir cette réponse à propos de l' No overload for method 'ToString' takes 1 argumentserreur.

Vous ne pouvez pas formater un DateTime Nullable - vous devez utiliser la propriété DateTime.Value.

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

Astuce: Il est toujours utile de travailler sur ces éléments dans une classe standard avec intellisense avant de les mettre en vue. Dans ce cas, vous obtiendrez une erreur de compilation qui serait facile à repérer dans une classe.

NightOwl888
la source
si j'utilise le code suggéré, j'obtiens cette erreur'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn