Как представление может отображать данные, которых нет в модели? - PullRequest
0 голосов
/ 17 марта 2010

Я столкнулся с проблемой представления, отображающего данные, которых нет в модели, и модели, содержащей данные, которых нет в представлении.

Представьте, что модель данных имеет дату рождения поле:

DateTime: BirthDate;

И представление позволяет пользователю ввести дату рождения:

Дата рождения: 11/28/1973

И эта дата входит в модель через контроллер, и с миром все в порядке.


Но способ, которым текст попал в TextBox, был не сразу, сначала пользователь вводит « 1 »:

Дата рождения: 1

Я не могу разобрать «1» как любую действительную дату. Контроллер может реагировать на этот поворот событий, например ::

  • он может оставить существующую дату рождения в модели в одиночку
  • он может установить его в какой-то форме "пусто"

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

  • "1"

но модель содержит

  • 11/28/1973

У нас есть разрыв между тем, что содержит модель, и тем, что показывает вид.

Предполагается, что представление представляет собой то, что находится в модели, но это не так. Вместо этого он показывает текст, который он хранит в свойстве TextBox.Text. Как согласовать разъединение между представлением, показывающим, что содержит модель, и представлением, показывающим, что ей действительно нужно?

Мне нужно где-то хранить это значение. я не могу оставить " 1 " в свойстве TextBox Text, и его нельзя сохранить в модели. Что делать?


Что делать, если пользователь сделал опечатку:

Дата рождения: z

Вид показывает:

  • "г"

но модель содержит

  • 11/28/1973

Все становится еще сложнее, когда представление совсем не похоже на модель данных:

Дата рождения: 6 дней назад

Мой контроллер может проанализировать эту строку и преобразовать ее в дату, например, 3/11/2010. Контроллер сохраняет дату 11.03.2010 в модели. Но теперь у нас есть несоответствие между представлением и моделью. Вид показывает:

  • "6 дней назад"

пока модель содержит:

  • 3/11/2010

Пользователь может ввести другие даты, которые я не могу распознать:

Дата рождения: Меркурий был в 7-м доме

Я понятия не имею, как превратить это в свидание, и я действительно не собираюсь пробовать. Я просто собираюсь сказать пользователю, чтобы войти в даты, как нормальный человек. Но вопрос в том, как показать пользовательский текст, который они ввели?

Представление используется контроллером для отображения содержимого модели . В этом случае модель не содержит « ртуть в 7-м доме » - это невозможно: модель для даты рождения - DateTime, которая не может содержать эту строку.

И когда пользователь пытается нажать «Сохранить», и я проверяю, является ли BirthDate действительным, я собираюсь (правильно) посмотреть на модель, которая содержит:

3/11/2010

и предположим, что пользователь ввел правильную дату. За исключением того, что они этого не сделали.


Ответы [ 2 ]

1 голос
/ 17 марта 2010

Есть два основных способа:

  1. Представленные данные обычно уже доступны где-то в области просмотра. Например, в веб-приложении оно по-прежнему доступно в качестве параметра запроса. Просто проверьте его наличие и отобразите соответственно в представлении.

  2. Получите начальное и переданное значения в дополнительном абстрактном слое. Когда переданное значение преобразуется и проверяется без ошибок, обновите начальное значение и удалите переданное значение, чтобы представление узнало, какое значение отображать. Большинство компонентов MVC, таких как Sun JSF и MS ASP.NET MVC, работают таким образом.

1 голос
/ 17 марта 2010

Я думаю, что вы недостаточно используете свой контроллер.

Контроллер имеет доступ к представлению, как вы сказали, но на самом деле вы используете его только для извлечения данных из модели.

Совершенно верно заполнить представление с контроллера данными, исходящими от контроллера, особенно в процессе проверки входящих данных.

В вашем случае Модель все еще может нести ответственность за прием данных, предварительно проанализированных с контроллера.

Функциональные возможности вашей модели могут варьироваться от тупого хранения / хранения данных до интеллектуального объекта с методами проверки параметров.

Контроллер играет роль семантической границы между представлением и моделью. данные представления могут быть выражены в ориентированной семантике представления, модель имеет собственную семантику (например, формат даты)

В вашем случае «6 дней назад» - это значение, связанное с полем представления даты (поле представляет собой семантику, ориентированную на реальное представление контейнера, содержащего строку «6 дней назад»)

3 варианта для вас:

  • с интеллектуальной моделью и тривиальным контроллером, при этом модель отвечает за возврат кода возврата «недопустимое значение» в контроллер, если значение не совместимо с методом ввода даты модели.
  • наличие интеллектуального контроллера и тривиальной модели, позволяющей контроллеру выполнять весь анализ
  • относительно умный контроллер и относительно умная модель (лучший вариант). Каждый действует в определенном семантическом поле. То есть: контроллер анализирует синтаксические ошибки, преобразует дату для соответствия интерфейсу модели, в то время как модель обрабатывает логические ошибки на основе значения даты, которое она получает.

Во всех случаях ошибок контроллер отвечает за заполнение представления данными, независимо от того, получены они из анализа модели или контроллера.

Поскольку контроллер впервые получил входящие данные, он может обновлять представление, используя входящие данные + информацию об ошибке, а не только данные, полученные от модели.

...