"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

Schreibe einen Kommentar