Как перенести метаданные DataAnnotation в ViewModel с помощью AutoMapper с помощью подхода Бетти

Мне нужно уточнить, как реализовать решение кода Бетти для передачи метаданных аннотаций данных в ViewModels с помощью AutoMapper (см. Здесь). Или, если у вас есть лучший способ, пожалуйста, поделитесь этим. Возможно, реализация ответа Бетти очевидна для тех, кто хорошо знает AutoMapper, но я новичок в этом.

Вот простой пример того, что я добавляю в этот код, чтобы заставить решение Бетти работать:

// Data model Entity
public class User1
{

    [Required]
    public int Id { get; set; }

    [Required]
    [StringLength(60)]
    public string FirstName { get; set; }

    [Required]
    [StringLength(60)]
    public string LastName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [StringLength(40)]
    public string Password { get; set; }

}

// ViewModel
public class UserViewModel
{

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Password { get; set; }

}

Текущая реализация AutoMapper:

// Called once somewhere
Mapper.CreateMap<User1, UserViewModel>(MemberList.Destination);

// Called in controller method, or wherever
User user = new User() { FirstName = "Tony", LastName = "Baloney", Password = "secret", Id = 10 };

UserViewModel userVM = Mapper.Map<User, UserViewModel>(user);

// NOW WHAT??? 

Я пробовал это в global.asax в Application_Start:

var configProvider = Mapper.Configuration as IConfigurationProvider;
ModelMetadataProviders.Current = new MetadataProvider(configProvider);
ModelValidatorProviders.Providers.Clear(); // everything's broke when this is not done
ModelValidatorProviders.Providers.Add(new ValidatorProvider(configProvider));

Кроме того, мне пришлось изменить GetMappedAttributes Бетти из:

propertyMap.DestinationProperty.GetCustomAttributes чтобы:propertyMap.DestinationProperty.MemberInfo.GetCustomAttributes

(или вместо MemberInfo, это MemberType?) для этого даже для сборки.

Но ничего не работает.

1 ответ

Решение

Поставщик метаданных не используется Automapper, он использует Automapper.

Вам не нужно вызывать его напрямую, он автоматически вызывается MVC, если вы регистрируете его в MVC при запуске в Global.asax.cs, например:

ModelMetadataProviders.Current = new MetadataProvider(
        AutoMapper.Mapper.Engine.ConfigurationProvider);

ModelValidatorProviders.Providers.Add(new ValidatorProvider(
        AutoMapper.Mapper.Engine.ConfigurationProvider);

или же:

ModelMetadataProviders.Current = new MetadataProvider(
        (AutoMapper.IConfigurationProvider)AutoMapper.Mapper.Configuration);

ModelValidatorProviders.Providers.Add(new ValidatorProvider(
        (AutoMapper.IConfigurationProvider)AutoMapper.Mapper.Configuration));
Другие вопросы по тегам