Как делать списки в модели просмотра? + данные

Я использую asp.net mvc 3, аннотации данных и автоматический сопоставление.

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

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

Так что мне делать? Как я могу использовать эти свойства и создать их коллекцию?

public class UserViewModel()
{
    [Required()]
    public string UserName = {get; set;}
    [Required()]
    public string FirstName = {get; set;}
    [Required()]
    public string LastName = {get; set;}
}

Я хочу использовать эти свойства для создания моей таблицы и использования для формы.

Единственное, о чем я могу думать, это делать

   public class AddUserViewModel()
    {
        [Required()]
        public string UserName = {get; set;}
        [Required()]
        public string FirstName = {get; set;}
        [Required()]
        public string LastName = {get; set;}
    }

   public class UserViewModel()
   {
       public List<User> Users {get; set;}
       public AddUserViewModel {get; set;}

       public UserViewModel()
       {
           Users = new List<Users>();
       }
   }

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

Таким образом, я использую свою модель домена для создания таблицы и моего AddUserViewModel для моего добавления пользователей.

Кажется, лишний избыток, поэтому я не уверен, есть ли лучший способ.

Edit

У меня есть что-то вроде этого

 var viewModel = new UserViewModel();
 List<Users> users=  UserService.GetAllUsers();
 viewModel = Mapper.Map<Users, UserViewModel>(users);
 return View("Index", viewModel);

Я также пробовал

var viewModel = new UserViewModel();
 List<Users> users=  UserService.GetAllUsers();
 viewModel.AddUserViewModel = Mapper.Map<Users, AddUserViewModel>(users);
 return View("Index", viewModel);

Изменить 2

У меня есть это, и он компилируется, но я получаю эту ошибку

        SomeViewModel viewModel = new SomeViewModel ();       
        List<User> users=  userService.GetAllUsers();
        viewModel.UserViewModel = Mapper.Map<List<User>, List<UserViewModel>>(users);
        return View("Index", viewModel);


Trying to map Domain.User to ViewModels.UserViewModel.
Missing type map configuration or unsupported mapping.
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.

Ответ 1

Зачем вам нужно возвращать список объектов домена в вашей модели просмотра? Это не те модели представлений, которые должны быть. Модели просмотра должны ссылаться только на другие модели представлений. Таким образом, у вас есть приятный UserViewModel, который представляет пользователя. Теперь вам нужно работать с несколькими пользователями в своем представлении, поэтому либо вы передаете IEnumerable<UserViewModel>, либо если вам нужны другие свойства, для которых вы создаете модель представления для этого:

public class UserViewModel
{
    [Required]
    public string UserName = { get; set; }
    [Required]
    public string FirstName = { get; set; }
    [Required]
    public string LastName = { get; set; }
}

public class SomeViewModel
{
    public List<UserViewModel> Users { get; set; }
    public string SomeOtherProperty { get; set; }
}

и теперь действие вашего контроллера может выглядеть следующим образом:

public ActionResult Foo()
{
    SomeModel model = _repository.GetModel();
    SomeViewModel viewModel = Mapper.Map<SomeModel, SomeViewModel>(model);
    return View(viewModel);
}

Теперь в вашем представлении вы можете просто использовать шаблон отображения для этого свойства Users (Html.DisplayFor(x => x.Users)), чтобы отобразить их список.


UPDATE:

После просмотра вашего обновления здесь, как действовать с точки зрения передового опыта:

public ActionResult Foo()
{
    IEnumerable<Users> users = _repository.GetUsers();
    IEnumerable<UserViewModel> usersViewModel = Mapper
        .Map<IEnumerable<Users>, IEnumerable<UserViewModel>>(users);
    return View(usersViewModel);
}

Я также использовал атрибут AutoMap в примере проект, который мог бы упростить ваш код:

[AutoMap(typeof(IEnumerable<Users>), typeof(IEnumerable<UserViewModel>))]
public ActionResult Foo()
{
    IEnumerable<Users> users = _repository.GetUsers();
    return View(users);
}

Этот атрибут будет автоматически запускаться после действия контроллера и перед визуализацией представления и будет использовать AutoMapper для замены модели соответствующей моделью представления.