Я работаю над своим первым приложением ASP.NET MVC, и у меня возникает небольшая путаница при создании / обновлении определенных данных.
У меня есть таблица базы данных User
, сгенерированный LinqToSql частичный класс User
и мой собственный пользовательский частичный класс User
.
Я использую [Bind(Exclude = "Id, InsertDateTime, UpdateDateTime")]
в моей версии User
, потому что я не хочу, чтобы пользователи редактировали эти поля.
У меня также есть поле PhoneNumber
, которое я делаю , чтобы пользователи могли его редактировать, но оно требует преобразования. Я сохраняю это в базе данных как 10 чисел, но когда я отображаю это пользователям через представление, я преобразовываю это в читаемый номер телефона в представлении как это:
string.Format("{0:(###) ###-####}", Convert.ToInt64(Model.User.PhoneNumber)).
Проблема в том, что когда пользователь нажимает кнопку Сохранить, номер телефона всегда будет в неправильном формате. Где-то мне нужно удалить все нечисловые символы (скобки, тире, косые черты и пробелы).
Вопросы
Как мне обработать действия Create и Edit для каждого из перечисленных ниже полей?
Id
- Я полагаю, что SQL-Server позаботится об этом автоматически, потому что все мои поля Id установлены как IDENTITY (1, 1)
. Я не тестировал подробно, но это, кажется, "просто работает". Пожалуйста, подтвердите.
InsertDateTime
- я хочу, чтобы для этого параметра было установлено значение DateTime.Now
только для действий Создать, а не для действий Редактировать. Итак, где будет подходящее место для установки этого значения: User, UserController, UserFormViewModel или что-то еще?
UpdateDateTime
- Я хочу, чтобы это было установлено на DateTime.Now
для действий «Создать» и «Редактировать», но опять же, куда мне поместить код, который выполняет это назначение?
PhoneNumber
- В отличие от трех приведенных выше полей, это поле доступно для редактирования пользователем, но его необходимо преобразовать из (888) 123-4567
в 8881234567
, прежде чем произойдет обновление. Пара вопросов здесь: (1) Где подходящее место для этого преобразования? Я преобразовываю номер телефона в «читаемый пользователем» формат в представлении, где я должен преобразовать его обратно в формат «хранилище базы данных»? (2) Должен ли я добавить PhoneNumber
к моему атрибуту [Bind(Exclude...)]
?
Обновление
Из ответов до сих пор, я думаю, уточнить некоторые вещи, по крайней мере, для себя.
Прежде всего, вот список мест, где что-то происходит с User
данными:
User
таблица в базе данных - обрабатывает присвоение идентификатора. Может предоставить значения по умолчанию для InsertDateTime и UpdateDateTime.
User
class - обрабатывает проверку с использованием метода GetRuleViolations()
.
UserRepository
class - абстрагирует функции сохранения данных (получить, получить все, добавить, удалить и сохранить).
UserController
class - обрабатывает пользовательские запросы и попытки публикации (индекс, детали, редактирование, публикация, редактирование, создание, публикация, создание и удаление).
UserFormViewModel
class - предоставляет строго типизированные данные для просмотра (объект User
плюс вспомогательные данные для выпадающих меню).
Views/User/Create.aspx
и Views/User/Edit.aspx
- генерирует HTML-код для отображения пользовательского интерфейса, комбинируя статические данные с динамическими данными (которые хранятся в модели представления).
В настоящее время я думаю, что ответственность за настройку Id
, UpdateDateTime
и InsertDateTime
концептуально лежит на модели. База данных определенно ответственна за установку Id
на вставке, но мне все еще немного неясно, где должны быть установлены поля даты и времени. Кажется, есть два варианта: хранилище (как предложено @Aaronaught) или класс User
(который уже обрабатывает проверку).
Что касается вопроса преобразования PhoneNumber
между ########## и (###) ### - ####, то это концептуально больше похоже на функцию "просмотра". Мне нравится идея @ Aaronaught иметь выделенный класс PhoneNumberConverter
, и я, вероятно, пойду с этим, но все еще остается вопрос о том, кто вызывает методы для этого класса. Для этого я склоняюсь к своему UserFormViewModel
классу.
Это приводит меня к двум последующим вопросам ...
Ответы на вопросы
Должны ли поля UpdateDateTime
и InsertDateTime
быть присвоены в классе UserRepository
или User
?
Имеет ли смысл вызывать методы преобразования телефонных номеров (в классе PhoneNumberConverter
) из UserFormViewModel
?