Отсутствуют данные при отправке с 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
тогда ничто не связано (они просто игнорируются).
Непонятно, почему вы хотели бы сделать это, тем более что вы не можете использовать проверку на стороне клиента, но вам либо нужно
- Модель представления с 3 свойствами, для
Day
,Month
а такжеYear
так что вы можете сильно привязать к свойствам с помощью помощников HTML. В методе POST вы можете затем построить дату на основе 3 свойств. - Вручную добавьте (несвязанный) HTML, как вы делаете во втором шаблоне, и напишите свой собственный
ModelBinder
который читает значения данных формы и строит дату. Пример показан в этой статье.