"EditorFor" auf nullable DateTime - "Nullable Objekt muss einen Wert haben."
Ich bin versucht, ein Formular anzuzeigen, mit der ein Benutzer zur Eingabe einer neuen Aufgabe für eine person. Ich bin mit einem DateTime.cshtml EditorTemplate zu handhaben DateTime-Werte für die Zuordnung. Die non-nullable DateTime funktioniert einwandfrei. Die nullable DateTime führt zu einer "InvalidOperationException: Nullable Objekt muss einen Wert haben."
Ich habe ein einfaches viewmodel, das wie folgt aussieht:
AssignmentViewModel.cs:
public Person Person { get; set; }
public Assignment NewAssignment { get; set; }
Zuweisung.cs enthält:
public DateTime AssignmentStartDate { get; set; }
public DateTime? AssignmentEndDate { get; set; }
Meine AssignmentController Create () - Methode sieht wie folgt aus:
public ViewResult Create(int personId)
{
Person person = personRepository.GetPersonById(personId);
var newAssignment = new AssignmentViewModel { Person = person, NewAssignment = new Assignment() };
return View(newAssignment);
}
Mein Schaffen.cshtml-Ansicht sieht so aus:
@model AssignmentViewModel
@using (Html.BeginForm("Create", "Assignment"))
{
@Html.Hidden("NewAssignment.PersonId", Model.Person.PersonId)
@Html.LabelFor(x => x.NewAssignment.AssignmentStartDate):
@Html.EditorFor(x => x.NewAssignment.AssignmentStartDate.Date, new { cssClass = "datePicker" })
<br />
@Html.LabelFor(x => x.NewAssignment.AssignmentEndDate):
@Html.EditorFor(x => x.NewAssignment.AssignmentEndDate.Value.Date, new { cssClass = "datePicker" })
<br />
<input type="submit" value="Send />
}
Mein DateTime.cshtml EditorTemplate aussieht:
@model DateTime?
@{
String modelValue = "";
if (Model.HasValue)
{
if (Model.Value != DateTime.MinValue)
{
modelValue = Model.Value.ToShortDateString();
}
}
}
@Html.TextBox("", modelValue, new { @class = "datePicker" })
Wenn ich versuche, laden Sie die Ansicht Erstellen, bekomme ich die exception oben erwähnt auf die Zeile "@Html."EditorFor" (x => x.NewAssignment.AssignmentEndDate.Wert)".
Werden Sie möglicherweise Fragen, warum ich mich übergeben AssignmentEndDate.Wert.Datum, statt nur auf der Durchreise AssignmentEndDate; der Grund ist, weil ich versuche auf den Punkt zu bringen, wo ich bin splitting-DateTime in Date und eine TimeOfDay Gebiet und rekombinieren Sie mit einem DateTimeModelBinder. Ich bin mit einer ähnlichen Technik hier gezeigt und hier.
Ich -kann - den Fehler umgehen, indem Sie meinen controller Create () - Methode instanziiert das ViewModel mit AssignmentEndDate auf DateTime festgelegt.MinValue, aber das scheint völlig falsch für einen nullable DateTime:
var newAssignment = new AssignmentViewModel
{
Person = person,
NewAssignment = new Assignment { AssignmentEndDate = DateTime.MinValue }
};
Etwas merkwürdiges passiert, nachdem ich "bypass" den Fehler, indem Sie einen Wert für die nullable DateTime; die Geltung des un-erforderlich nullable DateTime-Eigenschaft (AssignmentEndDate.Datum) schlägt fehl client-seitige Validierung. Sie versuchen, das Formular zu senden Höhepunkte der Bereich in rot.
Wie kann ich diese richtig verarbeiten?
InformationsquelleAutor Nick Silberstein | 2011-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie versuchen zum abrufen der
AssignmentEndDate.Value.Date
, aberAssignmentEndDate
istnull
, die Ergebnisse in diesen Fehler.Seit Ihrem editor-Vorlage akzeptiert ein
DateTime?
sind, sollten Sie nur weitergebenAssignmentEndDate
. In anderen Worten, entfernen Sie die.Value.Date
aus der Sicht:Seit Ihrem editor-template ist mit
ToShortDateString()
, es gibt keine Notwendigkeit zu "kürzen", die Zeit von dem Tag, an alle.Update
Bezug auf Ihren Wunsch nach separaten "Datum" und "Zeit" - Redakteure:
Du tun können dieses 2 Wege.
1 - Deine aktuelle
DateTime?
editor rendert einen Bereich für dieModel.Value.Date
, so könnte man einfach verlängern, dies machen auch ein Feld für dieModel.Value.TimeOfDay
. Beispiel:2 - Sie können teilen Sie die obigen Funktionen in 2 separate Editoren, "DateOnly" und "TimeOnly". Dann aktualisieren Sie Ihre Ansicht zu nennen-beide sind Herausgeber:
Die Wahl ist bis zu Ihnen, und ob Sie möchten, halten Sie das Datum und die Zeit, die Teile getrennt oder zusammen, aber das ist, wie ich gehen über die Lösung des Problems.
Der erste Teil macht Sinn ... das ist ein MVC-Sache, die nicht die Unterstützung der null-Logik überprüft. Ich werde aktualisieren, meine Antwort entsprechend.
Wenn Sie möchten, 2 separate Felder für Datum und Zeit, ich aktualisierte meine Antwort entsprechend.
Ich sehe nichts in deiner Antwort über separate Felder für das Datum und die Uhrzeit Komponenten des DateTime-Eigenschaft? Einfach entfernen .Wert.Datum wird nicht funktionieren. Ich gebe an diese für jetzt, ich nehme Ihre Antwort, denn es beantwortet die wichtigste Frage, aber ich kann nicht finden, eine Lösung, behebt alle Probleme, die ich habe. 😐
Es kann von einer WPF-hintergrund, aber das kombinieren/splitten von Daten ich fühle mich gehört in ein ViewModel, ich würde vorschlagen, das hinzufügen einer "AssignmentViewModel" die Spiegel-Zuordnung.cs enthält aber 2
DateTime
s (für start - /end-Datum) und 2TimeSpan
s (für start/Ende-Zeit). Ich entschied mich für die Erben meines ViewModels aus einer IViewModel<T> Benutzeroberfläche, mit einempublic T CreateModel();
Funktion, wo ich die Logikreturn new Assignment(){ AssignmentStartDate=StartDate.Date.Add( StartTime ), AssignmentEndDate=EndDate.Date.Add( EndTime ) };
InformationsquelleAutor Scott Rippey
erstellen Sie ein DateTime.cshtml in Ihrem Shared/DisplayTemplate Ordner
diese unterstützt Metadaten, die von datannotations verwendet werden, wenn Sie gefunden werden.
InformationsquelleAutor Bart Calixto
UPDATE: GetValueOrDefault behandelt es als eine DateTime-und damit die erforderlichen Feld-Prüfungen sind immer angebracht, da der ursprüngliche Ausdruck für ein datetime-nicht nullable datetime.
Daher die Lösung unten funktioniert nicht.
Wie der Fragesteller, ich habe auch die DateTimeModelBinder von hier:
Hier ist der Link
Dies ist, wie ich gelöst habe eine ähnliche situation:
Und dies ist, was mein DateTime EditorTemplate aussieht:
InformationsquelleAutor daytime