2017-02-20 3 views
1

я есть NewsViewModel, он включает:не может конвертировать из «System.Collections.Generic.IEnumerable <x>» к «х» при использовании автоматического картографа

public class CategoryViewModel 
{ 
    public CategoryViewModel() 
    { 
     List = new List<CategoryModel>(); 
    } 
    public IEnumerable<CategoryModel> List { get; set; } 
    public CategoryModel CategoryModel { get; set; } 
} 

ListNews: для показа списка новостей

NewsModel : для редактирования или вставки

. теперь мне нужно использовать для автопроизводителей. когда я использую этот код, покажите мне ошибку:

public PartialViewResult Edit(int id) 
{ 
    var model = new CategoryViewModel(); 
    var cat = _CategoryService.CategoryByID(id); 
    Mapper.Initialize(cfg => cfg.CreateMap<Category, CategoryModel>()); 
    model.CategoryModel = Mapper.Map<Category, CategoryModel>(cat); 
    var categorymodel = _CategoryService.GetAllCategory(); 
    Mapper.Initialize(cfg => cfg.CreateMap<Category, IEnumerable<CategoryModel>>()); 
    model.List = Mapper.Map<Category, IEnumerable<CategoryModel>>(categorymodel); 
    return PartialView(model); 
} 

как я могу решить эту проблему?

+0

Во-первых, вы неправильно используете automapper, вы не должны называть 'Mapper.Initialize' в своих методах. Конфигурация должна быть выполнена либо в файле «Startup.cs», либо в «Global.asax» –

+0

Показать CategoryViewModel. –

+0

Как вы установили Automapper в первую очередь? Install-Package AutoMaper? Это работало? – bcl

ответ

1

Вам не нужно создавать новую карту для коллекций, если у вас есть карта для типов этих коллекций. Поэтому удалите эту строку:

Mapper.Initialize(cfg => cfg.CreateMap<Category, IEnumerable<CategoryModel>>()); 

Также вы пытаетесь сопоставить один объект с коллекцией. Вы должны карту коллекции в коллекции вместо:

// move next line to Application_Start 
Mapper.Initialize(cfg => cfg.CreateMap<Category, CategoryModel>());  

var model = new CategoryViewModel(); 
var category = _CategoryService.CategoryByID(id); 
model.CategoryModel = Mapper.Map<CategoryModel>(category); 
var categories = _CategoryService.GetAllCategory(); 
model.List = Mapper.Map<IEnumerable<CategoryModel>>(categories); 

Дальнейшие соображения:

  • Использование Mapper.Map<TDestination> вместо Mapper.Map<TSource,TDestination>, потому что тип источника может быть выведен из аргумента метода
  • Используйте осмысленные имена переменных. Нет необходимости сохранять несколько символов для использования cat вместо category. И имя categoryModel просто вводит в заблуждение - эта переменная содержит список категорий.
  • И последнее - не создавать карты каждый раз, когда вы хотите отображать объекты. Создавайте карты один раз при запуске приложения.
+1

спасибо человеку, его работе. – Kianoush

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