28 votes

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 s'affiche au format correct, mais lorsque je modifie sa valeur en 19.11.2011 et soumets le formulaire, j'obtiens le message d'erreur suivant: "La valeur '19 .11.2011 'n'est pas valide pour StartDate."

Toute aide serait grandement appréciée!

43voto

Darin Dimitrov Points 528142

Vous devez définir le bon de la culture dans la mondialisation de l'élément de votre site web.fichier de configuration pour qui dd.MM.yyyy est un format valide datetime:

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

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


Mise à JOUR:

En fonction de votre exigence dans la section des commentaires que vous souhaitez conserver en-US la culture de l'application, mais toujours utiliser un des formats différents pour les dates. Cela pourrait être réalisé par la rédaction d'un modèle de classeur:

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

lequel vous devez vous inscrire en Application_Start:

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

11voto

Mark Points 12663

Sur la base de 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 du formulaire. Je peux donc dire que le serveur utilise une culture "en-US" mais avec un format de date différent.

Vous pouvez faire quelque chose comme ça 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" />
 

0voto

rolc Points 23

Ajouté ce code ci-dessous pour mondial.asax.cs fichier

protected void Application_BeginRequest()
{

CultureInfo info = new CultureInfo(Système d'.Le filetage.Fil de discussion.CurrentThread.CurrentCulture.ToString()); info.DateTimeFormat.ShortDatePattern = "dd.MM.aaaa"; Système.Le filetage.Fil de discussion.CurrentThread.CurrentCulture = info;

}

et ajouté le ci-dessous pour web.config sous <système.web>

<la mondialisation de la culture="fr-fr" />

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