在MVC5中使用DateTime和编辑器模板提交时缺少数据



我是MVC中的新手。我将编辑器模板用于创建3个文本框,用于日期,每年的DateTime类型。主视图:

    @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>

使用新的编辑器模板,验证模型。但是提交时,OneDay的价值为null!如何解决此问题?

您的第一个EditorTemplate是创建3个文本框,并在提交表单时使用名称onedayDefaultModelBinder试图将oneday的值设置为所看到的第一个值(1或2位数字))当然会失败(尝试自己设置DateTime oneday = 7;)。即使通过魔术确实成功,其他两个值也将被忽略。

在第二个EditorTemplate中,您的控件具有name="Day"name="Month"name="Year"。如果检查Response.Form,则会看到这些名称/值对,但由于模型没有任何名为DayMonthYear的属性,因此没有任何绑定(它们只是被忽略)。

不清楚为什么要这样做,尤其是因为您无法使用客户端验证,但是您要么需要

  1. 一个具有3个属性的视图模型,用于DayMonthYear您可以使用HTML助手强烈绑定到属性。在然后您可以根据3构建日期的帖子方法属性。
  2. 在第二个模板中手动添加(未绑定的)HTML,并且编写您自己的自定义ModelBinder,读取表单数据值并建立日期。本文显示了一个示例。

最新更新