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