@ 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

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

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.


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>

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


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


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

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

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


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


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.


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é


0

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

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

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> 

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


si j'utilise le code suggéré, j'obtiens cette erreur'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.