Question

J'essaie de comprendre comment formater une date en utilisant MVC3 RC2 et un modèle décoré avec DataAnnotations.

Ceci est mon modèle ...

public class Model
{
    [Display(Name = "Date of Birth")]
    [DisplayFormat(@DataFormatString = "MM/dd/yyyy")]
    public DateTime DateOfBirth { get; set; }
}

Ceci est mon contrôleur ...

public class IndexController : Controller
{
    public ActionResult Index()
    {
        return View( new Model() {DateOfBirth = DateTime.Now});
    }
}

Ceci est mon point de vue ...

@model MvcApplication6.Models.Model

@Html.LabelFor(m=>m.DateOfBirth)
@Html.TextBoxFor(m => m.DateOfBirth)
@Html.EditorFor(m => m.DateOfBirth)

Quand je lance le site, pour les commandes, la page affiche une zone de texte avec le temps inclus dans la chaîne, quand tout ce que je veux est la date (comme spécifié par la propriété décorée dans le modèle).

je Brad Wilson article sur ModelMetaData pour ce motif.

Est-il évident ce que je fais mal?

Était-ce utile?

La solution

Pour ce faire:

[DisplayName("Date of Birth")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DateOfBirth { get; set; }

Autres conseils

En fait, je crois que le problème ici est lié au fait que la DefaultModelBinder ne traite pas datetimes d'une manière appropriée (ce qui signifie que nous ne pouvons pas lier un champ frontal à un DateTime partielle , comme nous avions l'habitude de le faire dans d'autres [ toux CastleMonorail toux ] frameworks MVC).

J'ai créé exactement un liant de modèle personnalisé pour traiter cette question. Mais Scott Hanselman a fait quelque chose href="http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx" similaire , donc je suppose que vous pouvez simplement utiliser sa solution.

Bien sûr, vous pouvez faire face à cette situation par des attributs, mais cela signifie que vous aurez besoin de préciser que le formatage spécial tous DateTime champs. Et cela ne résoudra pas un autre problème: parfois nous devons avoir un champ pour la partie date et une autre pour la partie du temps uniquement dans le front-end , et de garder un seul champ datetime dans le back-end. Cette solution de modèle de liaison permet exactement cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top