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
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 DateTime
s, 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")
}
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.
@ 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
.
J'ai implémenté la même chose de cette façon:
@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 :)
Pour moi, il suffisait d'utiliser
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
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
}
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>
Vous pouvez utiliser Convert
<td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td>
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.
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.
C'est le meilleur moyen d'obtenir une chaîne de date simple:
@DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
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é