Пользовательские редакторы для пользовательских типизированных свойств для модели в MVC2 - PullRequest
1 голос
/ 31 марта 2010

Я работаю с некоторыми бизнес-объектами, которые связаны друг с другом своими свойствами. Например, я загружаю объект «Entry» из хранилища данных и связываю его с объектами «User» через свойства Author и Editor.

class Entry{
    public User Author { get; set; }
    public User Editor { get; set; }
}

class User{
    public string Username { get; set; }
}

Когда я создаю новый объект Entry с использованием MVC2, я хочу предоставить раскрывающийся список со списком доступных пользователей. Я заблудился относительно того, какой путь будет лучшим.

Сейчас я иду по пути использования звонков EditorFor, но у него есть свои проблемы. Например, я могу сделать следующее:

<%= Html.EditorFor(model => model.Author) %>

А затем создайте элемент управления представлением в Shared / EditorTemplates, который представляет его как раскрывающийся список (возможно?), Но похоже, что он повредит все изменения класса User. Например, если я пытаюсь редактировать объект User напрямую, я хочу иметь возможность обновлять поля, связанные с этим классом. Поэтому мне нужно, чтобы шаблоны редактора были контекстно-зависимыми.

Я также попытался пойти по пути создания формы вручную:

<%= Html.DropDownFor(model => model.Author, (IEnumerable<SelectListItem>)ViewData["Users"]) %>

Но это казалось грязным, и я запутался в том, как значения сериализуются обратно в объект User из SelectListItem.

Любая помощь приветствуется. Я уверен, что эта проблема уже была решена ранее, но у меня были проблемы с получением большей части информации из моих запросов.

1 Ответ

2 голосов
/ 31 марта 2010

Я рекомендую строго типизированные виды и EditFor. Гораздо проще поддерживать и тестировать.

Похоже, вам нужно начать использовать ViewModels. ViewModels - это абстракция между представлением и моделью, так что представление не взаимодействует напрямую с моделью, что может привести к проблемам, которые вы обнаружили.

ViewModel иногда является просто «оберткой» вокруг фактической Модели. Используя ваш класс Entry в качестве примера, ViewModel для этого может быть EntryViewModel. Он может иметь свойство Entry, а также поддерживать связанные данные, которые вы хотите отобразить. Важно то, что ViewModel содержит только данных, необходимых для поддерживаемого View, и ничего более.

Предположим, вы хотите, чтобы пользователи могли обновлять свойство Entry.Author из представления ввода - вы можете заполнить EntryViewModel списком идентификаторов и имен из Authors объекта / таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...