【问题标题】:How to Transfer DataAnnotation metadata to ViewModel with AutoMapper with Betty's Approach如何使用 AutoMapper 和 Betty 的方法将 DataAnnotation 元数据传输到 ViewModel
【发布时间】:2014-02-23 11:09:33
【问题描述】:

我需要澄清如何实现 Betty 的代码解决方案,以使用 AutoMapper 将数据注释元数据传输到 ViewModel(请参阅 here)。或者如果你有更好的方法,请分享。也许对熟悉 AutoMapper 的人来说,Betty 的答案的实现是显而易见的,但我是新手。

这是一个简单的例子,我应该在这段代码中添加什么来使 Betty 的解决方案起作用:

// 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??? 

我已经在 Application_Start 的 global.asax 中尝试过这个:

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

另外,我必须从以下位置修改 Betty 的 GetMappedAttributes:

propertyMap.DestinationProperty.GetCustomAttributes 至: propertyMap.DestinationProperty.MemberInfo.GetCustomAttributes

(或者不是 MemberInfo,它是 MemberType 吗?)甚至可以构建。

但似乎没有任何效果。

【问题讨论】:

    标签: asp.net-mvc automapper modelmetadata modelmetadataprovider


    【解决方案1】:

    Automapper 不使用元数据提供程序,它使用 Automapper。

    你不需要直接调用它,只要你在Global.asax.cs中启动时注册MVC,它就会被MVC自动调用,例如:

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

    【讨论】:

    • 谢谢!我将无法立即对此进行测试,但我希望这可行!在那之前,我会将此标记为答案...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多