在 MVC5 中使用 DateTime 和编辑器模板提交时缺少数据
Missing data when submit with DateTime and editor template in MVC5
我是 MVC 新手。我使用编辑器模板为日期时间类型的日、月、年创建 3 个文本框。
主视图:
@model mvc3date.Models.SomeDate
...
<html>
...
<body>
@using (Html.BeginForm())
{ ...
<div class="form-group">
@Html.LabelFor(model => model.oneday, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.oneday)
@Html.ValidationMessageFor(model => model.oneday)@**@
</div>
</div>
...}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
</body>
</html>
编辑器模板:
@model DateTime?
...
<td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
<td class="separator">/</td>
<td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
<td class="separator">/</td>
<td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
当我尝试将编辑器模板更改为:
时,我的问题没有解决
<td>@Html.TextBox("Day", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
<td class="separator">/</td>
<td>@Html.TextBox("Month", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
<td class="separator">/</td>
<td>@Html.TextBox("Year", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
使用新的编辑器模板,验证 model.oneday return 为真,可以提交此表单。但是提交的时候,oneday的值为null!如何解决这个问题?
您的第一个 EditorTemplate
正在创建 3 个名为 oneday
的文本框 当您提交表单时,DefaultModelBinder
尝试将 oneday
的值设置为第一个它看到的值(1 位或 2 位数字)当然会失败(尝试自己设置 DateTime oneday = 7;
)。即使通过魔法它确实成功了,其他 2 个值无论如何都会被忽略。
在第二个 EditorTemplate
中,您的控件有 name="Day"
、name="Month"
和 name="Year"
。如果您检查 Response.Form
,您将看到这些 name/value 对,但由于您的模型没有任何名为 Day
、Month
或 Year
的属性,因此没有任何绑定(他们只是被忽略了)。
不清楚您为什么要这样做,尤其是因为您不能使用客户端验证,但您要么需要
- 具有 3 个属性的视图模型,对于
Day
、Month
和 Year
所以
您可以使用 html 助手强绑定到属性。在
POST 方法,然后您可以根据 3 构造日期
属性。
- 像在第二个模板中一样手动添加(未绑定)html,并且
编写您自己的自定义
ModelBinder
来读取表单数据值
并建立日期。 this article. 中显示了一个示例
我是 MVC 新手。我使用编辑器模板为日期时间类型的日、月、年创建 3 个文本框。 主视图:
@model mvc3date.Models.SomeDate
...
<html>
...
<body>
@using (Html.BeginForm())
{ ...
<div class="form-group">
@Html.LabelFor(model => model.oneday, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.oneday)
@Html.ValidationMessageFor(model => model.oneday)@**@
</div>
</div>
...}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
</body>
</html>
编辑器模板:
@model DateTime?
...
<td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
<td class="separator">/</td>
<td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
<td class="separator">/</td>
<td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
当我尝试将编辑器模板更改为:
时,我的问题没有解决 <td>@Html.TextBox("Day", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
<td class="separator">/</td>
<td>@Html.TextBox("Month", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
<td class="separator">/</td>
<td>@Html.TextBox("Year", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
使用新的编辑器模板,验证 model.oneday return 为真,可以提交此表单。但是提交的时候,oneday的值为null!如何解决这个问题?
您的第一个 EditorTemplate
正在创建 3 个名为 oneday
的文本框 当您提交表单时,DefaultModelBinder
尝试将 oneday
的值设置为第一个它看到的值(1 位或 2 位数字)当然会失败(尝试自己设置 DateTime oneday = 7;
)。即使通过魔法它确实成功了,其他 2 个值无论如何都会被忽略。
在第二个 EditorTemplate
中,您的控件有 name="Day"
、name="Month"
和 name="Year"
。如果您检查 Response.Form
,您将看到这些 name/value 对,但由于您的模型没有任何名为 Day
、Month
或 Year
的属性,因此没有任何绑定(他们只是被忽略了)。
不清楚您为什么要这样做,尤其是因为您不能使用客户端验证,但您要么需要
- 具有 3 个属性的视图模型,对于
Day
、Month
和Year
所以 您可以使用 html 助手强绑定到属性。在 POST 方法,然后您可以根据 3 构造日期 属性。 - 像在第二个模板中一样手动添加(未绑定)html,并且
编写您自己的自定义
ModelBinder
来读取表单数据值 并建立日期。 this article. 中显示了一个示例