Как сделать списки в представлении модели? + аннотации - PullRequest
10 голосов
/ 30 января 2011

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

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

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

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

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 для добавления пользователей.

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

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

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

 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 Ответ

15 голосов
/ 30 января 2011

Зачем вам возвращать список объектов домена в вашей модели представления?Это не то, что должны быть модели представлений.Модели представлений должны ссылаться только на другие модели представлений.Таким образом, у вас есть хороший 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)), чтобы показать их список.


ОБНОВЛЕНИЕ:

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

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 для замены модели соответствующим представлениеммодель.

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