3

Ich versuche herauszufinden, wie ein Datum mit MVC3 RC2 und ein Modell mit DataAnnotations formatiert werden.Problem mit MVC ModelMetaData Attribute und Formatierung eines Datums

Das ist mein Modell ...

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

Das ist mein Controller ist ...

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

Dies ist meiner Meinung ...

@model MvcApplication6.Models.Model 

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

Als ich das laufen Für beide Steuerelemente wird auf der Seite ein Textfeld mit der Zeit angezeigt, die in der Zeichenfolge enthalten ist, wenn alles, was ich möchte, das Datum ist (wie von der eingerichteten Eigenschaft angegeben) im Modell).

Ich verwendete Brad Wilson article auf ModelMetaData für dieses Muster.

Ist es offensichtlich, was ich falsch mache?

Antwort

7

Tun Sie dies:

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

In der Tat glaube ich, hier, dass das Problem mit der Tatsache verbunden ist, dass die DefaultModelBinder nicht mit Datetimes in geeigneter Weise befasst (was bedeutet, dass wir nicht ein Front-End-Bereich binden kann zu einem DateTime- Teil, wie wir früher in anderen tun [HustenCastleMonorailHusten] MVC-Frameworks).

Ich habe eine benutzerdefinierte Modellmappe erstellt, um genau dieses Problem zu beheben. Aber Scott Hanselman hat etwas ähnliches getan here, also denke ich, dass Sie einfach seine Lösung verwenden können.

Natürlich können Sie mit dieser Situation durch Attribute umgehen, aber das bedeutet, dass Sie diese spezielle Formatierung in alle DateTime Felder angeben müssen. Und das wird ein anderes Problem nicht lösen: manchmal müssen wir ein Feld für den Datumsteil und einen anderen für den Zeitteil nur im Frontend haben und ein einzelnes Datetime-Feld im Backend behalten. Diese Modellbinderlösung ermöglicht genau das.