Datum nur von TextBoxFor ()

271

Ich habe Probleme, den einzigen Datumsteil einer DateTime mithilfe von TextBoxFor <,> (Ausdruck, htmlAttributes) in einem Textfeld anzuzeigen.

Das Modell basiert auf Linq2SQL, das Feld ist eine DateTime in SQL und im Entitätsmodell.

Gescheitert:

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

Dieser Trick scheint veraltet zu sein, jeder Zeichenfolgenwert im Objekt htmlAttribute wird ignoriert.

Gescheitert:

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

Ich möchte nur den Datumsteil in der Detail- / Bearbeitungsansicht ohne den Teil "00:00:00" speichern und anzeigen.

Kronos
quelle

Antworten:

237
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }

Dann:

<%=Html.EditorFor(m => m.StartDate) %>
Kevin Craft
quelle
Ja, da es jetzt den EditorFor-Helfer gibt und MVC2 fertiggestellt ist, ist Ihre Lösung der richtige Weg
Kronos
66
Aber jetzt kann der Jquery UI-Datepicker nicht auf diese Eingabe angewendet werden, da er meine @ class = "datepicker" -Attribute ignoriert, wie im Html.EditorFor () -Helfer angegeben. Dieses Textfeld ist jetzt korrekt formatiert, startet jedoch keinen Datepicker, wenn Sie darauf klicken. Also hat es eine Sache repariert und eine andere kaputt gemacht.
Aaron
5
Wie kann ich es in Übereinstimmung mit dieser Lösung anzeigen lassen, aber auch den Datepicker starten lassen, wie es mit Html.TextboxFor () getan hat
Aaron
49
Ich verwende die MVC4 Razor-Syntax, das Datumsfeld wird als gerendert @Html.EditorFor(m => m.IssueDate)und die Formatierung des Modells wird als angewendet, [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]aber das Datum wird weiterhin als01/01/0001 12:00:00 AM
bjan
4
@Aaron Es gibt keine Überladung von EditorFor mit einem htmlAttributes-Parameter. Sie übergeben es wahrscheinlich an den Parameter viewTemplate oder so, weil Sie denken, Sie hätten htmlAttributes übergeben. Dies ist der Nachteil von Editorfor. TextBoxFor ignoriert die DisplayFormat-Annotation. Die Lösung von Alexeyss wendet das Format anders an, um dies zu umgehen.
AaronLS
362

MVC4 hat dieses Problem durch Hinzufügen einer neuen TextBoxForÜberladung gelöst , die einen Parameter für das Zeichenfolgenformat verwendet. Sie können dies jetzt einfach tun:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

Es gibt auch eine Überladung, die HTML-Attribute akzeptiert, sodass Sie die CSS-Klasse festlegen, Datepicker verkabeln können usw.:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })
Ross McNab
quelle
40
Dies ist die beste Antwort für MVC4 - es ermöglicht mir, jquery UI Datepicker zu verwenden und formatiert die Auswahl dabei:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
Ericb
3
Danke dir! Es scheint jedoch ein Fehler zu sein, dass TextBoxFor das [DisplayFormat]Attribut des Modells ignoriert . Ich bin froh, dass es in TextBoxFor zumindest eine Überschreibung gibt (und dass Sie mich darauf aufmerksam gemacht haben).
Neil Laslett
7
Ich habe es so eingestellt, @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")aber auf httpPost bekomme ich Daten wie MM.dd.yyyy. Wie kann man das lösen?
user007
3
Ich kaufe dir ein Bier! Dieses kleine Problem bereitete mir solche Kopfschmerzen, bis ich diese Antwort fand.
JoshYates1980
3
Zu Ihrer Information : Viele Browser und die input[type=date]Spezifikation erfordern ein "{0:yyyy-MM-dd}"Format.
KyleMit
259
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>
Alexeyss
quelle
5
Die EditorFor-Lösung funktioniert nur, wenn Sie andere HTML-Attribute wie die ID oder die Klasse überschreiben müssen. Dies ist eine großartige Lösung. Seltsam, dass das V in Großbuchstaben geschrieben werden muss.
Ben Mills
1
Um Null sicher zu behandeln, können Sie Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy") ausführen. Der Standardwert von Datetime wird angezeigt, wenn Model.EndDate null ist.
15
In Bezug auf NULL - Wert, wäre der Standardwert von Datetime ist 1. Januar 1901, meiner Meinung nach , ist es besser zu nutzen@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan
1
@Spikolynn, dies hat für mich kein zweites 'Wert'-Attribut generiert (MVC3 / Rasiermesser-Vorlage).
Doug S
2
WICHTIG: Suchen Sie in "Wert" nach Großbuchstaben "V", ein kleiner Buchstabe reicht nicht aus!
Tejasvi Hegde
48

Oder verwenden Sie die untypisierten Helfer:

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>
andersjanmyr
quelle
22
Leichte Variation@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman
Es wird Razor anstelle der ASPX-Ansichts-Engine verwendet, aber beide funktionieren in MVC 4, und der Wechsel von einer Syntax zur anderen ist trivial. Ich habe in Razor gepostet, weil ich das verwendet und getestet habe. Wie ich schon sagte, es ist eine Variation.
Dan Friedman
1
@ Dan Friedman: Dies war der richtige Weg für mich! Früher habe ich mit einer Editor-Vorlage gearbeitet, aber dann musste ich auch mein eigenes HTML erstellen und alle Validierungsnachrichten UND alle Bootstrap-Attribute einschließen. Dies ist also der richtige Weg für mich (asp.net mvc5)
Michel
1
Können Sie ein neues Problem erstellen und detailliert beschreiben, was Sie getan haben? Kennzeichnen Sie mich und ich helfe Ihnen gerne weiter.
Dan Friedman
1
Diese Lösung ist die beste, wenn Sie eine Globalisierung benötigen.
Alansiqueira27
26

Das hat bei mir funktioniert.

@Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })
user5240713
quelle
12

Haben Sie keine Angst vor der Verwendung von rohem HTML.

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />
Tamas Czinege
quelle
4
Wie würde er es damals posten? Weil das Datum nur mit ziemlicher Sicherheit nicht auf dem Server zurückgemeldet wird.
Robert Koritnik
10
Solange Sie den richtigen 'name = "StartDate"' angeben, nimmt der Modellordner ihn auf.
Naspinski
@ DrJokepu das einzige, was für mich auf MVC3 funktioniert. Das heißt, ich konnte sowieso keinen Wert erstellen TextBoxForoder EditorForformatieren. Siehe meine Frage: TextBoxFor Helfer mischt Tag und Monat in Daten
Horgh
10

TL; DR;

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")

Die Bewerbung [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]hat bei mir nicht geklappt!


Erläuterung:

Um eine Datumseigenschaft Ihres Modells anzuzeigen, verwenden Sie Html.TextBoxFor:

Geben Sie hier die Bildbeschreibung ein

Datumseigenschaft Ihrer Modellklasse:

public DateTime DOB { get; set; }

Auf der Modellseite wird nichts anderes benötigt.


In Razor machst du:

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")


Erläuterung:

Das Datum eines HTML- inputElements vom Typ datemuss in Bezug auf ISO8601 formatiert sein. Dies ist:yyyy-MM-dd

Das angezeigte Datum wird basierend auf dem Gebietsschema des Browsers des Benutzers formatiert, der analysierte Wert wird jedoch immer mit JJJJ-MM-TT formatiert.

Ich habe die Erfahrung gemacht, dass die Sprache nicht durch den Accept-LanguageHeader bestimmt wird , sondern entweder durch die Anzeigesprache des Browsers oder durch die Betriebssystemsprache des Betriebssystems.

Legenden
quelle
4

Sie können auch die HTML 5-Attribute verwenden, indem Sie diese Datenanmerkung anwenden:

[DataType(DataType.Date)]

Das Problem ist jedoch, dass dies eine browserspezifische Datumsauswahl für HTML 5-Browser ermöglicht. Sie benötigen weiterhin eine eigene Datumsauswahl für Browser ohne Unterstützung, und dann müssen Sie sicherstellen, dass Ihre Datumsauswahl nicht zusätzlich zu der eines Browsers angezeigt wird (Modernizr kann dies problemlos ausführen), oder die Browser ausblenden, wenn dies der Fall ist (kompliziert und ich) Ich weiß nicht, wie zuverlässig die Methoden waren, die ich gesehen habe.

Am Ende habe ich mich für Alex entschieden, weil meine aktuelle Umgebung kein Modernizr hat, aber wenn es so wäre, hätte ich das verwendet, um meine Datenauswahl nur bedingt anzuzeigen, wenn der Browser noch keine unterstützt hätte.

AaronLS
quelle
3

Für mich musste ich das beibehalten, TextboxFor()da durch die Verwendung EditorFor()der Eingabetyp auf den neuesten Stand gebracht wurde. In Chrome wird eine integrierte Datumsauswahl hinzugefügt, die den bereits verwendeten jQuery-Datums-Picker vermasselt hat. Um weiterhin TextboxFor()AND zu verwenden und nur das Datum auszugeben, können Sie Folgendes tun:

<tr>
    <td class="Label">@Html.LabelFor(model => model.DeliveryDate)</td>
    @{
        string deliveryDate = Model.DeliveryDate.ToShortDateString();
    }
    <td>@Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) *</td>
    <td style="color: red;">@Html.ValidationMessageFor(model => model.DeliveryDate)</td>
</tr>
ScubaSteve
quelle
1

Das DisplayFormat-Attribut funktionierte beim ersten Laden in keiner Form für mich. Ich habe stattdessen eine EditorTemplate erstellt:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%@ Import Namespace="System.Web.Mvc.Html" %>
<%=
    Html.TextBox("", Model.ToShortDateString(), new { @class = "date-range" }) %>
Triskel
quelle
1

Der Vorlageneditor funktioniert nur zu Anzeigezwecken. Wenn Sie denselben Editor verwenden (was sinnvoll ist, da es sich um einen Editor handelt) und einen Wert wie den 31.01.2010 angegeben haben, wird eine Fehlermeldung angezeigt, dass das Format ungültig ist.

guerven
quelle
1

Ich verwende Globalize, arbeite also mit vielen Datumsformaten und verwende Folgendes:

@Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")

Dadurch wird das Datumsformat automatisch an die Ländereinstellungen des Browsers angepasst.

Liam
quelle
1

Beachten Sie, dass die Anzeige von der Kultur abhängt. Und obwohl in den meisten Fällen alle anderen Antworten richtig sind, hat es bei mir nicht funktioniert. Kulturprobleme verursachen auch andere Probleme mit jQuery Datepicker, falls beigefügt.

Wenn Sie das Format-Escape /auf folgende Weise erzwingen möchten :

@Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")

Wenn nicht für mich entkommen, zeigt es 08-01-2010vs. erwartet 08/01/2010.

Auch wenn jQuery datepicker nicht entkommen ist, wählt es ein anderes defaultDate aus, in meinem Fall war es May 10, 2012.

CrnaStena
quelle
1

Wenn Sie die Bootstrap- Datumsauswahl verwenden, können Sie das Attribut data_date_format wie folgt hinzufügen .

      @Html.TextBoxFor(m => m.StartDate, new { 
@id = "your-id", @class = "datepicker form-control input-datepicker", placeholder = "dd/mm/yyyy", data_date_format = "dd/mm/yyyy" 
})
uda
quelle
0

// Datums- und Uhrzeitanzeigen im datePicker sind 24.11.2011 00:00:00 Uhr

// Sie können dies nach Leerzeichen aufteilen und den Wert nur auf Datum setzen

Skript:

    if ($("#StartDate").val() != '') {
        var arrDate = $('#StartDate').val().split(" ");
        $('#StartDate').val(arrDate[0]);
    }

Markup:

    <div class="editor-field">
        @Html.LabelFor(model => model.StartDate, "Start Date")
        @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
    </div>

Hoffe das hilft ..

Coymax
quelle
7
Ihre Lösung sollte funktionieren. Meiner bescheidenen Meinung nach kann es jedoch gefährlich sein, sich auf das auf der Serverseite ausgegebene formatierte Zeichenfolgendatum auf die Clientseite zu verlassen. Wenn die regionalen Einstellungen auf der Serverseite kein Leerzeichen zwischen Datum und Uhrzeit enthalten, schlägt Ihre exponierte Lösung fehl.
Kronos
0

Sicher können Sie Html.EditorFor verwenden. Wenn Sie jedoch TextBoxFor verwenden und das Format aus dem DisplayFormat-Attribut verwenden möchten, können Sie es folgendermaßen verwenden:

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

oder nächste Erweiterung erstellen:

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}
Yury Dzhantuganov
quelle
0

Fügen Sie einfach neben Ihrem Modell hinzu.

[DataType(DataType.Date)]
public string dtArrivalDate { get; set; }
Arturas
quelle
0

Bei Verwendung von Tag-Hilfsprogrammen in ASP.NET Core muss das Format im ISO-Format angegeben werden. Wenn nicht als solche angegeben, werden gebundene Eingabedaten nicht richtig angezeigt und als MM / TT / JJJJ ohne Wert angezeigt.

Modell:

[Display(Name = "Hire")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? HireDate { get; set; }

Aussicht:

<input asp-for="Entity.HireDate" class="form-control" />

Das Format kann auch in der Ansicht mithilfe des Attributs asp-format angegeben werden.

Der resultierende HTML-Code sieht folgendermaßen aus:

<input class="form-control" type="date" id="Entity_HireDate" 
    name="Entity.HireDate" value="2012-01-01">
Michael Emerick
quelle
0

Sie können den folgenden Code verwenden, um die Zeit im HH: mm-Format zu drucken. In meinem Fall ist der Eigenschaftstyp TimeSpan. Der Wert kommt also im HH: mm: tt-Format, aber ich muss ihn im obigen Format anzeigen, d. H. HH: mm

Sie können diesen Code also verwenden:

@Html.TextBoxFor(x =>x.mTimeFrom, null, new {@Value =Model.mTimeFrom.ToString().Substring(0,5), @class = "form-control success" })
Sheriff
quelle
0

Wenn Sie darauf bestehen, das zu verwenden [DisplayFormat], MVC4 jedoch nicht verwenden, können Sie Folgendes verwenden:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
Aeon Suen
quelle