Я пытаюсь отобразить форму, которая позволяет пользователю вводить новое назначение для человека. Я использую DateTime.cshtml EditorTemplate для обработки значений DateTime для назначения. Необнуляемый DateTime работает отлично. Обнуляемый DateTime вызывает «InvalidOperationException: Nullable объект должен иметь значение».
У меня есть простая модель представления, которая выглядит следующим образом:
AssignmentViewModel.cs:
public Person Person { get; set; }
public Assignment NewAssignment { get; set; }
Assignment.cs содержит:
public DateTime AssignmentStartDate { get; set; }
public DateTime? AssignmentEndDate { get; set; }
Мой метод AssignmentController Create () выглядит следующим образом:
public ViewResult Create(int personId)
{
Person person = personRepository.GetPersonById(personId);
var newAssignment = new AssignmentViewModel { Person = person, NewAssignment = new Assignment() };
return View(newAssignment);
}
Мое представление Create.cshtml выглядит следующим образом:
@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 />
}
Мой DateTime.cshtml EditorTemplate выглядит так:
@model DateTime?
@{
String modelValue = "";
if (Model.HasValue)
{
if (Model.Value != DateTime.MinValue)
{
modelValue = Model.Value.ToShortDateString();
}
}
}
@Html.TextBox("", modelValue, new { @class = "datePicker" })
Когда я пытаюсь загрузить представление Create, я получаю исключение, упомянутое выше в строке "@ Html.EditorFor (x => x.NewAssignment.AssignmentEndDate.Value)".
Возможно, вам интересно, почему я передаю AssignmentEndDate.Value.Date вместо того, чтобы просто передавать AssignmentEndDate; причина в том, что я пытаюсь добраться до точки, где я разделяю DateTime на Date и поле TimeOfDay и рекомбинирую их с DateTimeModelBinder. Я использую технику, аналогичную , показанной здесь и здесь .
Я могу обойти ошибку, изменив метод контроллера Create () для создания экземпляра ViewModel с AssignmentEndDate, установленным в DateTime.MinValue, но это кажется совершенно неправильным для обнуляемого DateTime:
var newAssignment = new AssignmentViewModel
{
Person = person,
NewAssignment = new Assignment { AssignmentEndDate = DateTime.MinValue }
};
Что-то странное происходит после того, как я «обхожу» ошибку, предоставив значение для обнуляемого DateTime; необязательное свойство DateTime с нулевым значением (AssignmentEndDate.Date) не проходит проверку на стороне клиента. При попытке отправить форму поле подсвечивается красным.
Как я могу справиться с этим правильно?