Когда я использую проекцию для создания плоской ViewModel, я теряю метаданные - PullRequest
1 голос
/ 08 ноября 2010

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

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

class product{
  [DisplayName("Name")] 
  public String Name{get;set;}

  [DisplayName("Image")] 
  public String Image{get;set;}

  [DisplayName("Description")] 
  public String Description{get;set;}

  public String CategoryId{get;set;}
}

class category{
  [DisplayName("Code")] 
  Public String Id{get;set;}

  [DisplayName("Category name")] 
  public String Name{get;set;}

}

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

class productGridViewModel{
  Public String ProductName{get;set}
  Public String ProductImage{get;set}
  Public String ProductDescription{get;set}
  Public String CategoryName{get;set}
}

Меня беспокоит то, что мне нужно снова написать все аннотации DisplayName в viewModel.

Ответы [ 4 ]

1 голос
/ 08 ноября 2010

Если вы сглаживаете свои объекты модели в ViewModels, не должны ли атрибуты быть удалены из классов объектов модели и помещены в ViewModels? Объекты вашей модели не будут использоваться для отображения, поэтому у них не должно быть этих атрибутов.

0 голосов
/ 22 ноября 2010

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

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

Это немного работы и зависит от того, сколько времени это спасет вас, но не забывайте, что большая часть исходного кода MVC доступна, и вам не придетсяочень сильно измениться

Мартин

0 голосов
/ 08 ноября 2010

Одним из простых решений является использование в viewModel свойств, доступных только для чтения, которые читают метаданные базового объекта Model.Затем вы можете связать эти метаданные с соответствующим элементом управления в представлении.

Как показано ниже:

class productGridViewModel{ 
  Public String ProductName{get;set} 
  Public String ProductImage{get;set} 
  Public String ProductDescription{get;set} 
  Public String CategoryName{get;set} 

public string ProductDisplayName
        {
            get
            {
//Please dont mind this code.. I am sure you can write it in much better way.
                return typeof(Producy).GetProperty("Name").GetCustomAttributes(typeof(DisplayName))[0].ToString();
            }
        }
} 
0 голосов
/ 08 ноября 2010

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

Редактировать.

Вы можете использовать преобразования T4, чтобы гарантировать, что зависимый код будет обновляться. Фактически мы используем это, позволяя пользователям настраивать БД и, таким образом, разрешать выражать настройки в моделях представления.

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

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