gpt4 book ai didi

asp.net-mvc-3 - EditorFor 上可为空的 DateTime - "Nullable object must have a value."

转载 作者:行者123 更新时间:2023-12-04 07:07:31 24 4
gpt4 key购买 nike

我正在尝试显示一个允许用户为某人输入新任务的表单。我正在使用 DateTime.cshtml EditorTemplate 来处理分配的 DateTime 值。不可为空的 DateTime 工作正常。可为空的 DateTime 会导致“InvalidOperationException:可为空的对象必须具有值”。

我有一个看起来像这样的简单 View 模型:

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 View 如下所示:

@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" })

当我尝试加载“创建” View 时,我在“@Html.EditorFor(x => x.NewAssignment.AssignmentEndDate.Value)”行中遇到了上述异常。

您可能想知道为什么我要传入 AssignmentEndDate.Value.Date 而不是只传入 AssignmentEndDate;原因是因为我试图达到将 DateTime 拆分为 Date 和 TimeOfDay 字段并将它们与 DateTimeModelBinder 重新组合的地步。我正在使用与 shown here 类似的技术和 here .

我可以绕过错误,通过更改我的 Controller Create() 方法来实例化 ViewModel,并将 AssignmentEndDate 设置为 DateTime.MinValue,但这对于可为空的 DateTime 来说似乎完全错误:

var newAssignment = new AssignmentViewModel 
{
Person = person,
NewAssignment = new Assignment { AssignmentEndDate = DateTime.MinValue }
};

在我通过为可为空的 DateTime 提供一个值来“绕过”错误之后,发生了一些奇怪的事情;不需要的可为空的 DateTime 属性 (AssignmentEndDate.Date) 未能通过客户端验证。尝试提交表单会以红色突出显示该字段。

我该如何正确处理?

最佳答案

问题是您正在尝试检索 AssignmentEndDate.Value.Date,但 AssignmentEndDatenull,这会导致错误。

由于您的编辑器模板接受 DateTime?,您应该只传递 AssignmentEndDate。换句话说,从 View 中删除 .Value.Date:

@Html.EditorFor(x => x.NewAssignment.AssignmentEndDate, new { cssClass = "datePicker" })

由于您的编辑器模板使用 ToShortDateString(),因此根本不需要从日期“截断”时间。

更新

关于您希望拥有单独的“日期”和“时间”编辑器:

您可以通过两种方式做到这一点。

1 - 您当前的 DateTime? 编辑器为 Model.Value.Date 呈现一个字段,因此您可以简单地扩展它以也为 呈现一个字段>Model.Value.TimeOfDay。示例:

@{
DateTime? modelDate = (Model == null) ? (DateTime?)null : Model.Value.Date;
TimeSpan? modelTime = (Model == null) ? (TimeSpan?)null : Model.Value.TimeOfDay;
}
@Html.TextBox(..., modelDate, new{@class="datePicker"})
@Html.TextBox(..., modelTime, new{@class="timePicker"})

2 - 您可以将上述功能拆分为 2 个单独的编辑器,“DateOnly”和“TimeOnly”。然后,更新您的 View 以调用两个编辑器:

@Html.EditorFor(x => x.NewAssignment.AssignmentEndDate, "DateOnly")
@Html.EditorFor(x => x.NewAssignment.AssignmentEndDate, "TimeOnly")

选择权取决于您,以及是否要将日期和时间部分分开或放在一起,但这就是我解决此问题的方法。

关于asp.net-mvc-3 - EditorFor 上可为空的 DateTime - "Nullable object must have a value.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com