Html вспомогательная строка форматирования TextBox в метку времени Unix

Что-то действительно странное происходит при попытке создать шаблон EditorTemplate для создания средства выбора даты. Значение, передаваемое в шаблон, является строкой, но преобразуется в метку времени Unix. Эта строка на самом деле ранее была преобразована из метки времени Unix на контроллере, а затем отправлена ​​в представление в виде строки в моей viewModel, поэтому я не знаю, связаны ли оба кода каким-либо образом (??). Я уменьшил шаблон редактора до:

1 @model String
2
3 @Model.ToString()
4 @Html.TextBox("", Model.ToString())

В строке 3 выводится правильное значение "3/7/14", но в строке 4 создается текстовое поле со значением "1404309600"

Это действительно сбивает с толку. Любая помощь? Спасибо.

Отредактировано с новой информацией

После выполнения большего количества тестов я могу объяснить немного больше, в чем проблема и откуда она идет. Я использую FullCalendar, и когда я выбираю диапазон дат, в новом модальном окне открывается форма для создания нового события. Запрос пути Ajax является чем-то вроде

Создать? STARTDATE =1404309600& ENDDATE =1404396000

Затем мой контроллер заполняет данные для события и, помимо прочего, форма включает в себя переданные даты начала и окончания, но в виде строки. Все данные передаются в представление на ViewModel.

Представление использует следующую строку кода для вызова EditorTemplate для создания ввода DatePicker:

@Html.EditorFor(model => model.StartDateVm, new { Value = Model.StartDateVm.ToString() })

И я украсил параметры с помощью [UIHint("DatePicker")]

Итак, возвращаясь к исходной проблеме: эта строка генерирует вход со значением временного промежутка Unix, передаваемого в контроллер вместо строки ViewModel.

После некоторых исследований я понял, что параметр из fullcalendar называется "startDate", а параметр в моей ViewModel - "StartDate". Я изменил имя атрибута ViewModel на StartDateVm и все его ссылки на это имя, и теперь на входе отображается правильная строка. Так что я думаю, что каким-то образом помощник TextBox получает значение из браузера, а не из ViewModel.

У меня вопрос, почему это происходит. Теперь я знаю обходной путь, но я хотел бы понять, где проблема. Я думаю, что это связано с этим объяснением, данным в MSDN, но я не совсем понимаю: значение извлекается в следующем порядке - объект ModelStateDictionary, значение этого параметра, объект ViewDataDictionary и, наконец, атрибут value в атрибуты HTML.

1 ответ

Решение

Поэтому TextBox в моем шаблоне брал значение из KeyValuePair с ключом "StartDate", который жил в ModelStateDictionary. Этот словарь был заполнен, когда мой javascript вызывает мой контроллер и происходит привязка ("Представляет состояние попытки привязать опубликованную форму к методу действия" - MDSN). Даже когда я передавал значение Model.StartDate в шаблон, TextBox отдает предпочтение соответствующему ключу ModelStateDictionary!

Таким образом, мой обходной путь дал дату начала моей модели имя StartDateVm. Как я обнаружил в посте Гари Кларка, такое поведение помощников полезно, поэтому мы не повторяем код, присваивающий те же значения модели представления, когда она уже существует в ModelState. Я рекомендую вам пост Гари.

Другие вопросы по тегам