203 votes

L'éditeur de type de données MVC4 DataType.Date EditorFor n'affiche pas la valeur de la date dans Chrome, mais fonctionne bien dans Internet Explorer.

J'utilise l'attribut DataType.Date sur mon modèle et un EditorFor dans ma vue. Cela fonctionne bien dans Internet Explorer 8 y Internet Explorer 9 mais en Google Chrome Il affiche un sélecteur de date et au lieu d'afficher la valeur, il affiche simplement "Mois/Jour/Année" en texte gris délavé.

Pourquoi Google Chrome n'affiche-t-il pas la valeur ?

Modèle :

[DataType(DataType.Date)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }

Voir :

<td class="fieldLabel">Est. Pur. Date</td>
<td class="field">@Html.EditorFor(m=>m.EstPurchaseDate)</td>

Chrome

Internet Explorer

387voto

Darin Dimitrov Points 528142

Lorsque vous décorez une propriété de modèle avec [DataType(DataType.Date)] le modèle par défaut d'ASP.NET MVC 4 génère un champ de saisie de type type="date" :

<input class="text-box single-line" 
       data-val="true" 
       data-val-date="The field EstPurchaseDate must be a date."
       id="EstPurchaseDate" 
       name="EstPurchaseDate" 
       type="date" value="9/28/2012" />

Les navigateurs qui prennent en charge HTML5, comme Google Chrome, rendent ce champ de saisie avec un sélecteur de date.

Afin d'afficher correctement la date, la valeur doit être formatée comme suit 2012-09-28 . Citation du spécification :

valeur : Une date complète valide telle que définie dans [RFC 3339], avec l'ajout de l'information suivante supplémentaire que l'année est composée de quatre chiffres ou plus représentant un nombre supérieur à 0.

Vous pouvez faire respecter ce format en utilisant l'option DisplayFormat attribut :

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }

44 votes

Darin merci, c'était parfait ! Tu as répondu à tant de mes questions sur MVC ces deux dernières années, tu es génial !

3 votes

Excellente réponse mais j'ai l'impression que c'est un appel que vous devez forcer pour que le contrôle fonctionne correctement !

7 votes

Quel serait le moyen de faire cela "globalement" pour toutes les propriétés marquées. [DataType(DataType.Date)] pour ne pas avoir à marquer toutes ces propriétés séparément avec le risque d'en manquer certaines ?

11voto

Azoro Points 146

Dans MVC 3, j'ai dû ajouter :

using System.ComponentModel.DataAnnotations;

parmi les utilisations lors de l'ajout de propriétés :

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

Surtout si vous ajoutez ces propriétés dans le fichier .edmx comme moi. J'ai constaté que par défaut, les fichiers .edmx n'ont pas cette utilisation et que l'ajout des propriétés n'est pas suffisant.

10voto

bernieb Points 69

Si vous retirez [DataType(DataType.Date)] de votre modèle, le champ de saisie dans Chrome est rendu comme suit type="datetime" et n'affiche pas non plus le sélecteur de date.

0 votes

Merci Bernie. Ce n'est pas tant l'affichage du sélecteur qui me posait problème que le fait que les données ne soient pas saisies dans le champ de saisie. Mais c'est bon à savoir.

0 votes

Opera rend un datepicker cependant. Utilisez modernizr pour faire du polyfill.

1 votes

Si c'est censé être une date, elle doit être rendue comme une entrée de type date . Utilisation de datetime comme solution de rechange est inappropriée, car elle ne représente pas sémantiquement les données.

4voto

markpcasey Points 234

J'avais toujours un problème avec le format yyyy-MM-dd, mais je l'ai contourné en modifiant le fichier Date.cshtml :

@model DateTime?

@{
    string date = string.Empty;
    if (Model != null)
    {
        date = string.Format("{0}-{1}-{2}", Model.Value.Year, Model.Value.Month, Model.Value.Day);
    }

    @Html.TextBox(string.Empty, date, new { @class = "datefield", type = "date"  })
}

0 votes

Merci, ça a enfin marché, j'ai essayé string.Format("{0}/{1}/{2}") pour obtenir dd/mm/yyyy et cela fonctionne bien, j'ai utilisé la première méthode de la base de données mais DisplayFormat n'a pas fonctionné avec la classe partielle, je ne sais pas pourquoi , de toute façon tout le monde peut essayer si nécessaire ce méthode, je n'ai pas essayé mais si quelqu'un a besoin, j'espère que cela aidera

3voto

Blerton Hoxha Points 19

Répondre à MVC4 DataType.Date EditorFor n'affiche pas la valeur de la date dans Chrome, mais fonctionne bien dans IE.

Dans le modèle, vous devez avoir le type de déclaration suivant :

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

OU

[DataType(DataType.Date)]
public Nullable<System.DateTime> DateXYZ { get; set; }

Vous n'avez pas besoin d'utiliser l'attribut suivant :

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

À la Date.cshtml utiliser ce modèle :

@model Nullable<DateTime>
@using System.Globalization;

@{
    DateTime dt = DateTime.Now;
    if (Model != null)
    {
        dt = (System.DateTime)Model;

    }

    if (Request.Browser.Type.ToUpper().Contains("IE") || Request.Browser.Type.Contains("InternetExplorer"))
    {
        @Html.TextBox("", String.Format("{0:d}", dt.ToShortDateString()), new { @class = "datefield", type = "date" })
    }
    else
    {
        //Tested in chrome
        DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat;
        dtfi.DateSeparator = "-";
        dtfi.ShortDatePattern = @"yyyy/MM/dd"; 
        @Html.TextBox("", String.Format("{0:d}", dt.ToString("d", dtfi)), new { @class = "datefield", type = "date" })
    } 
}

Amusez-vous bien ! Salutations, Blerton

0 votes

Si vous procédez de cette manière, Chrome ne vous proposera pas de sélecteur de date. J'utilise votre solution, mais en la modifiant de manière à ce que 1) j'utilise effectivement l'option DisplayFormat attribut 2) Modifier le test pour vérifier si le type de navigateur est chrome, alors faire @Html.EditorFor(m=>m.EstPurchaseDate) 3) Else do @Html.TextBox("EstPurchaseDate", dt.ToString("MM/dd/yyyy")) Note : pour le point 2, une meilleure vérification serait de savoir si le navigateur comprend le HTML5, mais je ne sais pas comment le faire.

4 votes

Downvoting pour la détection du navigateur dans le code côté serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X