35 Stimmen

Datum bei Bindung formatieren (ASP.NET MVC)

In meiner ASP.net MVC-Anwendung habe ich eine Ansicht, die wie folgt aussieht:

...
<label>Due Date</label>
<%=Html.TextBox("due")%>
...

Ich verwende eine ModelBinder um den Beitrag an mein Modell zu binden (die Eigenschaft due ist von DateTime Typ). Das Problem ist, wenn ich "01/01/2009" in das Textfeld eingebe und der Beitrag nicht validiert wird (weil andere Daten falsch eingegeben wurden). Das Bindemittel füllt es mit dem Datum wieder auf und Zeit "01/01/2009 00:00:00 ".

Gibt es eine Möglichkeit, dem Binder mitzuteilen, dass er das Datum korrekt formatieren soll (z. B. ToShortDateString() )?

0 Stimmen

Das habe ich gestern auch schon erlebt. Ich wünschte, sie hatten eine Überlastung, die Sie in einem Format-String übergeben lassen.

0 Stimmen

Ich denke, die hier vorgeschlagene Lösung ist sauberer: stackoverflow.com/questions/8089316/

55voto

Nick Chadwick Punkte 551

Ich bin gerade auf diese sehr einfache und elegante Lösung gestoßen, die in MVC 2 verfügbar ist:

http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx

Grundsätzlich, wenn Sie MVC 2.0 verwenden, verwenden Sie die folgenden in Ihrer Ansicht.

 <%=Html.LabelFor(m => m.due) %>
 <%=Html.EditorFor(m => m.due)%>

Erstellen Sie dann eine Teilansicht in /Views/Shared/EditorTemplates mit dem Namen DateTime.ascx.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %>
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" }) %>

Wenn der EditorFor<> aufgerufen wird, findet er eine passende Editorvorlage.

2 Stimmen

Das hat bei mir funktioniert, aber sicherlich wird es die tous Instanzen von DateTimes... was, wenn Sie unterschiedliche Formatierungsanforderungen für verschiedene Instanzen haben?

8 Stimmen

@saw-lau: Sie können mehrere Vorlagen wie oben mit unterschiedlichen Namen erstellen und dann den Vorlagennamen als zweites Argument an Html.EditorFor() übergeben, falls erforderlich.

24voto

Qerim Shahini Punkte 671

Dekorieren Sie die Eigenschaft in Ihrem Modell mit dem DataType Attribut, und geben Sie an, dass es ein Date und nicht ein DateTime :

public class Model {
  [DataType(DataType.Date)]
  public DateTime? Due { get; set; }
}

Sie müssen Folgendes verwenden EditorFor 代わりに TextBoxFor auch in der Ansicht:

@Html.EditorFor(m => m.Due)

9voto

Cephas Punkte 794

Es ist ein schmutziger Trick, aber er scheint zu funktionieren.

<%= Html.TextBoxFor(model => model.SomeDate,
    new Dictionary<string, object> { { "Value", Model.SomeDate.ToShortDateString() } })%>

Sie erhalten die Modellbindung und können die HTML-Eigenschaft "value" des Textfelds mit einer formatierten Zeichenfolge überschreiben.

7 Stimmen

Gefällt mir. kurz und bündig. hier ist meine kleine Variante: <%= Html.TextBoxFor( model => model.SomeDate, new { @Value = Model.SomeDate.ToShortDateString() } )%>

0 Stimmen

+1 für euch beide, dieser kleine Trick hat mir eine Menge Zeit erspart :).

0 Stimmen

Funktioniert nicht mit aktivierter clientseitiger Validierung, da diese das Datum aus dem Modell verwendet und die Übermittlung blockiert, wenn es sich im Format für das Gebietsschema unterscheidet, gegen das es validiert wird.

4voto

Casper Punkte 1242

Warum benutzen Sie nicht

<% =Html.TextBox("due", Model.due.ToShortDateString()) %>

0 Stimmen

Corin möchte das Datum eingeben und nicht nur das Datum anzeigen. Das Problem hängt mit der Bindung des Datums an das erforderliche Format zusammen.

4voto

Craig M Punkte 5506

Ich habe diese Frage gefunden, als ich selbst nach einer Antwort suchte. Die obigen Lösungen haben bei mir nicht funktioniert, weil mein DateTime nullable ist. Hier ist, wie ich es mit Unterstützung für nullable DateTime-Objekte gelöst.

<%= Html.TextBox(String.Format("{0:d}", Model.Property)) %>

0 Stimmen

Falsch, @Quoo's Antwort funktioniert auch perfekt mit nullable DateTime. Habe es gerade getestet.

1 Stimmen

Schau dir die Daten an, Internet-Held. Seine Antwort wurde über ein Jahr nach meiner gepostet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X