Я столкнулся с проблемой представления, отображающего данные, которых нет в модели, и модели, содержащей данные, которых нет в представлении.
Представьте, что модель данных имеет дату рождения поле:
DateTime: BirthDate;
И представление позволяет пользователю ввести дату рождения:
Дата рождения: 11/28/1973
И эта дата входит в модель через контроллер, и с миром все в порядке.
Но способ, которым текст попал в TextBox, был не сразу, сначала пользователь вводит « 1 »:
Дата рождения: 1
Я не могу разобрать «1» как любую действительную дату. Контроллер может реагировать на этот поворот событий, например ::
- он может оставить существующую дату рождения в модели в одиночку
- он может установить его в какой-то форме "пусто"
Но теперь у нас есть проблема, потому что вид показывает:
но модель содержит
У нас есть разрыв между тем, что содержит модель, и тем, что показывает вид.
Предполагается, что представление представляет собой то, что находится в модели, но это не так. Вместо этого он показывает текст, который он хранит в свойстве TextBox.Text. Как согласовать разъединение между представлением, показывающим, что содержит модель, и представлением, показывающим, что ей действительно нужно?
Мне нужно где-то хранить это значение. я не могу оставить " 1 " в свойстве TextBox Text
, и его нельзя сохранить в модели. Что делать?
Что делать, если пользователь сделал опечатку:
Дата рождения: z
Вид показывает:
но модель содержит
Все становится еще сложнее, когда представление совсем не похоже на модель данных:
Дата рождения: 6 дней назад
Мой контроллер может проанализировать эту строку и преобразовать ее в дату, например, 3/11/2010. Контроллер сохраняет дату 11.03.2010 в модели. Но теперь у нас есть несоответствие между представлением и моделью. Вид показывает:
пока модель содержит:
Пользователь может ввести другие даты, которые я не могу распознать:
Дата рождения: Меркурий был в 7-м доме
Я понятия не имею, как превратить это в свидание, и я действительно не собираюсь пробовать. Я просто собираюсь сказать пользователю, чтобы войти в даты, как нормальный человек. Но вопрос в том, как показать пользовательский текст, который они ввели?
Представление используется контроллером для отображения содержимого модели . В этом случае модель не содержит « ртуть в 7-м доме » - это невозможно: модель для даты рождения - DateTime
, которая не может содержать эту строку.
И когда пользователь пытается нажать «Сохранить», и я проверяю, является ли BirthDate действительным, я собираюсь (правильно) посмотреть на модель, которая содержит:
3/11/2010
и предположим, что пользователь ввел правильную дату. За исключением того, что они этого не сделали.