2011-01-30 2 views
10

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

Я хочу, чтобы все мои аннотации по свойствам в моей модели просмотра после проверки свойств прошли проверку. Я использую 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>(); 
     } 
    } 

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

Таким образом, я использую свою модель домена для создания таблицы и моего 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); 

Edit 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. 
+0

Я полностью не понимаю ваш вопрос ни того, что вы пытаетесь достичь. –

+0

@ Darin Dimitrov - Я был опечаткой. Это исправлено сейчас. Я пытаюсь понять, как я могу продолжать использовать аннотации данных в модели представления, но также возвращать список объектов моего домена, возможно, не дублируя код дважды. Сейчас все в объекте «Пользователи» является в основном дубликатом того, что находится в AddUserViewModel(). Я мог бы помещать аннотации в объект домена, но я не хочу этого делать. – chobo2

ответ

16

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

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

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

+0

@ Darin Dimitrov - Хм, мне показалось, что было неплохо иметь коллекцию моделей взглядов. Трудно определить, что является правильным способом, как в этом учебнике http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models .aspx он делает что-то, что у меня есть – chobo2

+0

@ chobo2, нет, это не плохая практика вообще иметь коллекции моделей взглядов. В примере, который вы ссылаетесь, используется 'IEnumerable ', что именно я предложил вам в первой части моего ответа: 'IEnumerable '. В этом примере «Продукт» следует рассматривать как модель представления. Также вы должны избегать создания циклов foreach в ваших представлениях. Вы должны использовать шаблоны отображения/редактора. Это сделает ваш код намного более кратким. Таким образом, вы можете легко заменить foreach, показанный в сообщении в блоге, одной строкой в ​​представлении: 'Html.DisplayFor (x => x.Products)'. –

+0

@Darin Dimitrov - Но разве это не предмет его домена? Я имею в виду, тогда вы можете подумать, что я сказал мне мой ViewModel (Пользователь). Я думаю, что шаблоны diplay/editor - это совершенно новый вопрос, поскольку я всегда использую foreach. – chobo2

Смежные вопросы