Отсутствуют данные при отправке с DateTime и шаблоном редактора в MVC5

Я новичок в 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>

С новым шаблоном редактора, валидация для model.oneday возвращает true и может быть отправлена ​​эта форма. Но при отправке значение однодневки равно нулю! Как решить эту проблему?

1 ответ

Решение

Ты первый EditorTemplate создает 3 текстовых поля с именем oneday Когда вы отправляете форму, DefaultModelBinder пытается установить значение oneday к первому значению, которое он видит (1 или 2-значное число), которое, конечно же, не работает DateTime oneday = 7; сам). Даже если по волшебству все получилось, остальные 2 значения будут проигнорированы.

Во-вторых EditorTemplate ваши элементы управления имеют name="Day",name="Month" а также name="Year", Если вы проверяете Response.Form вы увидите эти пары имя / значение, но так как ваша модель не имеет именованных свойств Day, Month или же Year тогда ничто не связано (они просто игнорируются).

Непонятно, почему вы хотели бы сделать это, тем более что вы не можете использовать проверку на стороне клиента, но вам либо нужно

  1. Модель представления с 3 свойствами, для Day, Month а также Year так что вы можете сильно привязать к свойствам с помощью помощников HTML. В методе POST вы можете затем построить дату на основе 3 свойств.
  2. Вручную добавьте (несвязанный) HTML, как вы делаете во втором шаблоне, и напишите свой собственный ModelBinder который читает значения данных формы и строит дату. Пример показан в этой статье.
Другие вопросы по тегам