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

时间:2015-05-07 04:39:55

标签: asp.net asp.net-mvc-5 mvc-editor-templates

我是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的验证返回true,可以提交此表单。但是当提交时,oneday的值为null!如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

不清楚为什么要这样做,特别是因为你不能使用客户端验证,但你需要

  1. 包含3个属性的视图模型,适用于DayMonthYear 您可以使用html帮助器强烈绑定到属性。在 然后你可以使用POST方法根据3构造日期 属性。
  2. 在第二个模板中手动添加(未绑定)html,并且 编写自己的自定义ModelBinder来读取表单数据值 并建立日期。 this article
  3. 中显示了一个示例