Связывание модели в связывателе модели - PullRequest
0 голосов
/ 02 апреля 2009

Во-первых, потерпите меня здесь. У меня есть пользовательский механизм связывания моделей, который успешно отображает данные формы в пользовательский объект. Внутри этой связующей модели она также отображает элементы формы в другой пользовательский объект. То, что я чувствую, я должен быть в состоянии сделать, это создать отдельное связующее для моделей, чтобы позаботиться об этом втором отображении. Это упрощенная версия.

Пользовательские объекты:

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    public string Description { get; set; }
    public IEnumerable<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Status { get; set; }
}

Если моя форма отправляет обратно несколько идентификаторов для подкатегорий, мне нужно просто запустить хранилище данных и увлажнить объект подкатегории. Из формы будет представлен список подкатегорий в следующем формате:

<input type="text" name="Name" value="This Category" />

<input type="hidden" name="subcat.Index" value="0" />
<select name="subcat[0].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="1" />
<select name="subcat[1].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="2" />
<select name="subcat[2].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

Написание пользовательского элемента для сопоставления категории, очевидно, просто, написание связывателя модели, который, в свою очередь, сопоставит подкатегорию (в связывателе модели я бы запустил запрос к моему хранилищу данных), оказывается немного сложным.

Я не уверен, насколько ясно я сделал это, извиняюсь, спасибо за чтение, и, пожалуйста, дайте мне знать, если я могу что-то сказать, чтобы сделать это яснее!

Ответы [ 2 ]

5 голосов
/ 02 апреля 2009

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

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

  • Нет необходимости вносить в белый список поля, которые пользователь может обновлять, поскольку модель презентации содержит только эти поля.
  • Связыватель модели по умолчанию будет работать для всех, кроме самых сложных сценариев связывания модели. На практике я нахожу, что мне нужно использовать пользовательский связыватель модели только тогда, когда значение, которое видит пользователь, должно быть условно связано с каким-то другим значением. При использовании модели презентации структура вашей модели презентации должна соответствовать структуре страницы, поэтому вам не нужно использовать привязку пользовательской модели по структурным причинам.
  • Вы сможете создавать свои представления и контроллеры до создания базы данных или модели сущностей. Это означает, что вы можете получить заказчик на свой дизайн, прежде чем выполнять большой объем работ по созданию окончательной системы. Это помогает разобраться в структурных проблемах в модели объекта, прежде чем они произойдут. Просто создайте модель презентации, которая соответствует странице, которую, по вашему мнению, хочет видеть клиент, постройте общую схему страницы, используя готовый экземпляр этой модели презентации, и покажите ее клиенту. Если они довольны, вы можете построить модель хранилища / сущности и написать запрос LINQ, чтобы сопоставить его с вашей моделью презентации.

Итак, в вашем примере подкатегории будут поступать из коллекции форм в виде списка целых чисел. Следовательно, модель представления должна иметь одинаковый список целых чисел. В контроллере после привязки можно вызвать метод для переноса значений модели из модели представления в материализованный экземпляр категории из хранилища.

1 голос
/ 13 апреля 2009

Я бы рекомендовал взглянуть на этот пост Singing Eels , в котором приведен пример другого подхода. Используя примерный подход StatefulObjectBinder, можно связать коллекции бизнес-объектов, которые необходимо извлечь из базы данных. Поскольку контроллер реализует IModelBinder, у вас есть доступ к хранилищу, которое можно использовать для увлажнения необходимых объектов и добавления их в коллекцию объектов.

...