2013-05-10 65 views
5

我试图使用ViewModels开始 - 但我遇到了这个POST的问题没有验证 - 模型中的值显示在代码下方的Watch部分中:在ASP.Net中使用AutoMapper的正确方法MVC

ModelStats.IsValid =假

Invalid ModelState

我ItemViewModel是:

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; } 
    } 

我相信这会很简单 - 但我只是看了这么长时间,我无法弄清楚我做错了什么。任何人都可以请指教?

谢谢,马克

+1

ViewModel的验证是在设置'UserName'属性之前,所以我猜它是空的,验证失败。无论如何,你为什么需要ViewModel中所需的用户名? – Zabavsky 2013-05-10 08:00:52

回答

11

就验证失败而言。

如果您没有在形式提供UserName,然后从ItemViewModel

删除[必填为了使用AutoMapper

首先,创建一个映射,如

Mapper.CreateMap<Item, ItemViewModel>(); 

而且那么地图

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

请参阅:如何使用AutoMapper?部分在https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

+0

嗨 - 感谢 - 这是ModelState,它不验证 - 所以没有达到映射器。你能看到有什么问题吗?谢谢,Mark – Mark 2013-05-10 08:00:07

+0

@fixit,如果'ModelState'无效,那么你已经把一些失败的验证,'ModelState'与* AutoMapper * – Satpal 2013-05-10 08:02:38

+0

@fixit无关。你是否在表单中提供'UserName'?如果没有,从viewModel – Satpal 2013-05-10 08:08:19

1

确保您的ItemViewModel,Item类具有相同的字段与否。如果具有相同数据类型AutoMapper的相同字段正常工作。

Mapper.CreateMap< Item, ItemViewModel>(); 

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

如果两个类的字段不相同,请确保与自定义映射相同。

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

在上述自定义映射FullnameUserVM字段与FirstName,从UserDMLastName字段映射(这里UserDM是域模型,UserVM是视图模型)。

相关问题