2013-05-10 19 views
5

Próbuję tarta przy użyciu ViewModels - ale mam problemy z tym POST nie sprawdzania poprawności - wartości w modelu są wyświetlane w części Watch poniżej kodu:Prawidłowy sposób używania AutoMapper w ASP.Net MVC

ModelStats.IsValid = false

Invalid ModelState

Moja ItemViewModel jest:

public class ItemViewModel 
    { 
    public int ItemId { get; set; } 
    [Display(Name = "Item")] 
    public string ItemName { get; set; } 
    [Display(Name = "Description")] 
    public string Description { get; set; } 
    [Display(Name = "Price")] 
    public double UnitPrice { get; set; } 
    [Range(0.00, 100, ErrorMessage = "VAT must be a % between 0 and 100")] 
    public decimal VAT { get; set; } 
    [Required] 
    public string UserName { get; set; } 
    } 

Jestem pewien, że będzie to coś prostego - ale tak długo przyglądałem się temu, nie potrafię zrozumieć, co robię źle. Czy ktoś może doradzić?

Dzięki, Mark

+1

Walidacja ViewModel jest przed ustawieniem właściwości 'UserName', więc, myślę, że jest null i sprawdzanie poprawności nie powiedzie się. Dlaczego mimo wszystko potrzebujesz wymaganej nazwy użytkownika w swoim ViewModelu? – Zabavsky

Odpowiedz

11

Jeśli chodzi o niepowodzenie walidacji.

Jeśli nie dostarczają UserName w formie, następnie wyjąć [Wymagane] z ItemViewModel

w celu wykorzystania AutoMapper

Najpierw Tworzenie mapy, takie jak

Mapper.CreateMap<Item, ItemViewModel>(); 

I następnie odwzoruj

var itemModel = Mapper.Map<Item, ItemViewModel>(model); 

Patrz: Jak korzystać z AutoMappera? Sekcja w https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

+0

Witam - dziękuję - to ModelState, którego nie sprawdzam - nie dotarłem aż do mappera. Czy widzisz coś złego w tym? Dzięki, Mark – Mark

+0

@fixit, jeśli 'ModelState' jest niepoprawny, to wprowadziłeś pewną walidację, która się nie udała,' ModelState' nie ma nic wspólnego z * AutoMapper * – Satpal

+0

@fixit, Czy podasz 'UserName' w formularzu? Jeśli nie, usuń '[Wymagane]' z viewModel – Satpal

1

Upewnij się, że klasy ItemViewModel, Item mają te same pola lub nie. Jeśli te same pola z tym samym typem danych AutoMapper działa dobrze.

Mapper.CreateMap< Item, ItemViewModel>(); 

Mapper.Map< Item, ItemViewModel>(ItemVM); 

Jeśli w obu klasach nie są takie same pola, upewnij się, że to samo dotyczy niestandardowego mapowania.

Mapper.CreateMap<UserDM, UserVM>().ForMember(emp => emp.Fullname, 
map => map.MapFrom(p => p.FirstName + " " + p.LastName)); 

W powyższym niestandardowego odwzorowywania Fullname jest UserVM pole, które odwzorowuje z FirstName, LastName pól z UserDM (tutaj UserDM to jest domena modelu, UserVM jest Widok Model).