asp.net mvc automapper синтаксический анализ

скажем, у нас есть что-то вроде этого

public class Person
{
   public string Name {get; set;}
   public Country Country {get; set;}
}

public class PersonViewModel
{
   public Person Person {get; set;}
   public SelectList Countries {get; set;}
}

Можно ли использовать automapper для выполнения синтаксического анализа Person в PersonViewModel и обратно?


person Omu    schedule 09.11.2009    source источник
comment
Да, это возможно, но откуда берутся страны?   -  person queen3    schedule 09.11.2009
comment
у меня есть что-то вроде CountryService.GetCountries ()   -  person Omu    schedule 10.11.2009


Ответы (3)


Не используйте для этого AutoMapper - оно того не стоит. Например, в случаях, когда у вас произошел сбой проверки и вы снова показываете форму - AutoMapper здесь не выполняется (обычно). Обычно мы идем двумя маршрутами:

  • Если список не зависит от контекста, создайте HtmlHelper, который запрашивает некоторый ISelectListProvider для элементов списка выбора: Html.DropDownList (). Вы могли бы использовать свой контейнер IoC по выбору, чтобы найти personListProvider, запросить список элементов и заполнить раскрывающийся список.
  • Если список зависит от контекста, просто создайте список в действии контроллера.
person Jimmy Bogard    schedule 10.11.2009
comment
Не могли бы вы рассказать мне свое мнение об этом шаблоне ViewModel http://stackoverflow.com/questions/1361092/asp-net-mvc-viewmodel-pattern - person Omu; 11.11.2009

Похоже, вы хотите отправить Person в представление через PersonViewModel, в котором есть вся бонусная информация, необходимая для генерации и возврата нового (или обновленного) объекта Person.

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


РЕДАКТИРОВАТЬ: При этом, да, вы должны иметь возможность использовать automapper для перемещения информации. Это просто ненужный слой для этого простого сценария.

person Nick Larsen    schedule 09.11.2009
comment
на самом деле я сделал что-то подобное, но ppl сказал, что это плохо stackoverflow.com/questions/1361092/ - person Omu; 10.11.2009
comment
Проблема 2 в принятом ответе относится к тому факту, что вы включили перечисление SelectListItem в свою модель представления (что заставляет ваш контроллер реализовывать информацию, специфичную для представления). Чтобы исправить это, вам нужно сделать просто IEnumerable ‹String› (или, может быть, какой-то тип Country вместо строки), чтобы ваше представление могло решить, как отображать эту информацию. Передача списка выбора подразумевает информацию о том, как представление должно отображать данные, что противоречит идее MVC. - person Nick Larsen; 10.11.2009

при желании вы можете сделать это:

public class Person
{
   public string Name {get; set;}
   public Country Country {get; set;}
   public Country[] GetCountries 
   {
    ... add method for countries here
   }
}

Затем в вашей ViewModel вы можете сделать так, чтобы ваш список выбора извлекал данные из этой коллекции.

public class PersonViewModel
{
   public Person Person {get; set;}
   public Country[] Countries {get; set;}
   public SelectList Countries { get{ .. add new select list code here getting vals from Countries..}}
}

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

person James Fleming    schedule 19.01.2010