【发布时间】:2011-12-20 19:20:51
【问题描述】:
我正在尝试显示一个允许用户为某人输入新任务的表单。我正在使用 DateTime.cshtml EditorTemplate 来处理分配的 DateTime 值。不可为空的 DateTime 工作正常。可为空的 DateTime 会导致“InvalidOperationException:可为空的对象必须具有值”。
我有一个看起来像这样的简单视图模型:
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" })
当我尝试加载“创建”视图时,我在“@Html.EditorFor(x => x.NewAssignment.AssignmentEndDate.Value)”行中遇到了上述异常。
您可能想知道为什么我要传入 AssignmentEndDate.Value.Date 而不是只传入 AssignmentEndDate;原因是因为我试图达到将 DateTime 拆分为 Date 和 TimeOfDay 字段并将它们与 DateTimeModelBinder 重新组合的地步。我正在使用与shown here 和here 类似的技术。
我可以绕过错误,通过更改我的控制器 Create() 方法来实例化 ViewModel,并将 AssignmentEndDate 设置为 DateTime.MinValue,但这对于可为空的 DateTime 似乎完全错误:
var newAssignment = new AssignmentViewModel
{
Person = person,
NewAssignment = new Assignment { AssignmentEndDate = DateTime.MinValue }
};
在我通过为可为空的 DateTime 提供一个值来“绕过”错误之后,发生了一些奇怪的事情;不需要的可为空的 DateTime 属性 (AssignmentEndDate.Date) 未能通过客户端验证。尝试提交表单会以红色突出显示该字段。
我该如何正确处理?
【问题讨论】:
标签: asp.net-mvc-3