ASP.NET format MVC3-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; }
    ...
}

Dans la vue, j'ai quelque chose comme ceci:

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

StartDate est affiché dans le format correct, mais quand je change sa valeur à 19.11.2011 et que je soumets le formulaire, je reçois le message d'erreur suivant: "la valeur '19.11.2011' n'est pas valide pour StartDate."

Toute aide serait grandement appréciée!

28
demandé sur šljaker 2011-10-20 16:00:02

3 réponses

vous devez définir la culture appropriée dans l'élément mondialisation de votre web.fichier de configuration pour dd.MM.yyyy est un format datetime valide:

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

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


mise à jour:

selon vos exigences dans la section commentaires, vous souhaitez conserver la culture en-US de l'application, mais utilisez tout de même un format différent pour les dates. Cela pourrait être réalisé en écrivant un modèle personnalisé liant:

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 inscrire en Application_Start:

ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());
42
répondu Darin Dimitrov 2017-05-23 22:11:56

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

le fait est que Le 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
répondu VJAI 2012-06-21 15:20:34

a ajouté ce code à global.asax.cs le fichier

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é ce qui suit à web.config<system.web>

<globalization culture="en-US">;
0
répondu Rolwin C 2017-08-17 00:03:39