Вопрос

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

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

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>

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top