web-dev-qa-db-fra.com

ASP.NET MVC3 - Format DateTime

J'utilise ASP.NET MVC 3.
Mon ViewModel ressemble à ceci:

public class Foo
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
    public DateTime StartDate { get; set; }
    ...
}

En vue, j'ai quelque chose comme ça:

<div class="editor-field">
    @Html.EditorFor(model => model.StartDate)
    <br />
    @Html.ValidationMessageFor(model => model.StartDate)
</div>

StartDate est affiché au format correct, mais lorsque je modifie sa valeur en 19.11.2011 et que je soumets le formulaire, le message d'erreur suivant s'affiche: "La valeur '19 .11.2011 'n'est pas valide pour StartDate."

Toute aide serait grandement appréciée!

28
šljaker

Vous devez définir la culture appropriée dans l'élément de globalisation de votre fichier web.config pour lequel dd.MM.yyyy est un format de date/heure valide:

<globalization culture="...." uiCulture="...." />

Par exemple, c'est le format par défaut en allemand: de-DE.


METTRE À JOUR:

Selon vos besoins, dans la section des commentaires, vous souhaitez conserver la culture en-US de l'application tout en utilisant un format différent pour les dates. Cela pourrait être réalisé en écrivant un classeur de modèle personnalisé:

using System.Web.Mvc;
public class MyDateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (!string.IsNullOrEmpty(displayFormat) && value != null)
        {
            DateTime date;
            displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
            // use the format specified in the DisplayFormat attribute to parse the date
            if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
            else
            {
                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName, 
                    string.Format("{0} is an invalid date format", value.AttemptedValue)
                );
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

que vous allez enregistrer dans Application_Start:

ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());
42
Darin Dimitrov

Basé sur votre commentaire, je vois que tout ce que vous voulez est un courant anglais mais avec un format de date différent (corrigez-moi si je me trompe).

Le fait est que DefaultModelBinder utilise les paramètres de culture du serveur pour les données de formulaire. Je peux donc dire que le serveur utilise la culture "en-US" mais avec un format de date différent.

Vous pouvez faire quelque chose comme ceci dans le Application_BeginRequest et vous avez terminé! 

protected void Application_BeginRequest()
{
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;
}

Web.Config

<globalization culture="en-US" />
10
VJAI

Ajouté ce code ci-dessous à global.asax.cs file

protected void Application_BeginRequest()  
{        
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());     
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;     
}

Et ajouté le texte ci-dessous à web.config under <system.web>

<globalization culture="en-US">;
0
Rolwin C