Binden Datetime-Modell Wert auf datepicker und geben Sie auf controller-Methode
Baue ich eine MVC4-app und in meinem Modell habe ich diese Felder:
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime mDateCreated { get; set; }
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime? mDateModified { get; set; }
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime? mDateLastDisplayed { get; set; }
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime mStartDate { get; set; }
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime? mEndDate { get; set; }
Ich versuche, datepickers in einer Ansicht. Hier ist, was ich bisher getan habe:
<div class="float-left">
<p>Date Created:</p>
<p>Date of last modification:</p>
<p>Date Last Displayed:</p>
<p>Date of promotion's start:</p>
<p>Date of promotion's end:</p>
</div>
<div class="float-right">
<p>
@Html.TextBoxFor(_item => _item.mCardOfTheDay.mDateCreated, new
{
@value = Model.mCardOfTheDay.mDateCreated,
@selectedDate = Model.mCardOfTheDay.mDateCreated,
@class = "datePick",
@type = "date",
@id = "dateCreated"
})
</p>
<p>
@(Model.mCardOfTheDay.mDateModified != null ? Html.DisplayFor(_item => _item.mCardOfTheDay.mDateModified) : Html.Label(ValueDomain.FIELD_UNAVAILABLE))
</p>
<p>@(Model.mCardOfTheDay.mDateLastDisplayed != null ? Html.DisplayFor(_item => _item.mCardOfTheDay.mDateLastDisplayed) : Html.Label(ValueDomain.FIELD_UNAVAILABLE))</p>
<p>
@*@Html.EditorFor(_item => _item.mCardOfTheDay.mStartDate, new { @class = "datePick", @type="date" })*@
@*@Html.TextBoxFor(_item => _item.mCardOfTheDay.mStartDate, new {@id = "dateStart"})*@
@* @Html.TextBoxFor(_item => _item.mCardOfTheDay.mStartDate, new
{
@value = (DateTime?) Model.mCardOfTheDay.mStartDate,
@selectedDate = (DateTime?) Model.mCardOfTheDay.mStartDate,
@class = "datePick",
@type = "date",
@id = "dateStart"
})*@
</p>
<p>
@Html.TextBoxFor(_item => _item.mCardOfTheDay.mEndDate, new
{
@value = Model.mCardOfTheDay.mEndDate,
@selectedDate = Model.mCardOfTheDay.mEndDate,
@class = "datePick",
@type = "date",
@id = "dateEnd"
})
</p>
</div>
<div class="clear"></div>
Und CSS zu zeigen, was ich mache, mit den Klassen:
$('.datePick').datepicker({
dateFormat: "dd/ww/yy",
});
$('.datePick').each(function () {
var a = $(this).datepicker({
dateFormat: "dd/ww/yy",
defaultDate: new Date($(this).val())
});
});
Dieser zeigt die verschiedenen Probleme, die ich habe. Erstens:
- Mit
Html.TexborFor
Helfer mit@value
,@selectedDate
und so weiter zeigt einen datepicker, aber das datepicker-Standard gezeigt Wert istaaaa-mm-dd
statt den Wert der gebundenen zu dem Modell und wenn ich übergeben das Modell an die Steuerung keine Daten gehalten (was bedeutet, dass die mEndDate ist immer null); - Versuchen, nur um einen datepicker endet mit dem gleichen Ergebnis;
- Hier ist ein Beispiel der Html code, der sich hinter Ihnen zeigen die "Ergebnisse" habe ich:
<input class="input-validation-error datePick" data-val="true" data-val-date="The field mDateCreated must be a date." data-val-required="The mDateCreated field is required." id="dateCreated" name="mCardOfTheDay.mDateCreated" selectedDate="11/21/2013 00:00:00" type="date" value="" />
- Und wenn ich die "EditorFor", alles, was ich habe, ist ein Datum im string format, kein datepicker.
Was ich will, ist ein datepicker mit den das richtige Datum ausgewählt, dass an dem ausgewählten Datum an die controller-Methode in der post. Kann mir jemand helfen, herauszufinden, warum dies nicht funktioniert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht überschreiben Sie den Wert der Datum-Eingabe mit dem gleichen Datum in einem anderen format, gibt es keinen Grund und es wird nur Kopfschmerzen verursachen. Aus meiner Erfahrung sind Sie besser dran, zu verlassen, wie es ist.
Was Sie jedoch tun müssen ist, konfigurieren Sie den datepicker richtig so, dass es weiß, wie es zu interpretieren, das Datum kommt aus der Datenbank. Wenn Sie zeigen möchten, ein anderes format für den Benutzer, als der man zurück gebucht auf den server, können Sie Gebrauch machen von der
altField
(Quelle) undaltFormat
(Quelle) option.Erlauben, Sie zu verwenden
dateFormat
zu Anzeige die Datum in einem beliebigen format, die Sie wie in den input der Nutzer, während die gebuchten Wert in das richtige format.Brauchen Sie nicht mehr :
Werden Sie auch brauchen, um loszuwerden
ApplyFormatInEditMode = true
auf Ihre Modell-Eigenschaft Attribute. Lassen Sie den Rahmen behandeln Datumsangaben basieren auf aktuellen Kultur, nicht versuchen, gegen die es durch die Anwendung Formate ganz über dem Platz.Lassen Sie einfach das Textfeld mit dem Wert sein, was auch immer Ihre Datenbank sendet, und verwenden Sie die datapicker-Funktionalität zu tun, was Sie benötigen auf der client-Seite.
Nur die Zeit, würde ich dir raten, überschreiben Sie den Wert, wenn Sie besorgt sind über dem Eingang zeigt den Teil der Zeit, wenn Sie wollen nur das Datum. In diesem Fall sollten Sie es ja gerne machen :
Bemerken
@Value
mit einem Kapital v, das ist tatsächlich wichtig und nicht ein Tippfehler. Sie übergeben dann ein Datum-format in derToString
Methode, aber es muss das gleiche format wie Ihre Datenbank.Edit:
Ich ging voran und baute eine kleine test-Fall zu versuchen und zu replizieren, Ihr Problem. Hier ist, was ich habe :
Controller :
ViewModel :
Anzeigen :
JS:
Diesem funktioniert alles wie erwartet; datepicker hat, das Datum in der Eingabe-Wert standardmäßig ausgewählten Wert
model.DateCreated
einenDateTime
Objekt auf post. Bemerken, dass ich nicht Durcheinander mit den Formaten, aber irgendwo in der Anzeige, wo ich ersetzt das vollständige Datum mit der kurzen standard-date-Muster.Können Sie versuchen, vereinfachen Sie Ihren code zu entsprechen, was ich habe und lassen Sie mich wissen, was passiert?
Gut, nach so vielen Jahren, würden Sie auf jeden Fall haben aussortiert dieses Problem, aber noch wollte die Antwort für alle diejenigen, die neu zu diesem problem:
Der datepicker soll das format YYYY-MM-DD als Wert. Einstellige Tage und Monate werden sollten, aufgefüllt mit einer 0. Januar 01. Sie können einfach ändern Sie Ihre Datumsformat als