5

Мне нужно уточнить, как реализовать кодовое решение Бетти для передачи метаданных аннотаций данных в ViewModels с помощью AutoMapper (см. here). Или, если у вас есть лучший способ, поделитесь этим. Возможно, реализация ответа Бетти очевидна для того, кто хорошо знает AutoMapper, но я новичок в этом.Как передать метаданные данныхAnnotation в ViewModel с помощью 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)); 
+0

спасибо! Я не смогу проверить это немедленно, но я надеюсь, что это сработает! до тех пор я отмечу это как ответ ... –