【问题标题】:In AutoMapper, is it possible to determine what the destination property name would be for a particular source property在 AutoMapper 中,是否可以确定特定源属性的目标属性名称
【发布时间】:2011-04-05 15:55:10
【问题描述】:

注意:问题与映射元数据有关,而不是映射值。即目标映射属性的名称是什么,而不是映射值。

背景: 我正在使用带有自动映射器的 MVC 2 在域实体和视图模型之间进行映射。我在域模型中定义了一些域级别的验证规则,以及使用数据注释在视图模型中定义的更多特定于 ui 的验证规则。为了保持 DRY,我不想在视图模型中重复我的域验证规则。相反,我希望能够使用我已经在 AutoMapper 中设置的映射信息将域模型中的属性名称映射到视图模型中的相应属性名称。然后使用 ModelState.AddModelError() 将域验证错误添加到 ModelState 中,以显示在视图上。

验证消息中的属性名称需要匹配,以便 MVC 可以在表单上正确控件旁边显示消息。

【问题讨论】:

  • 如果你有 source.Foo 你的目标通常是 target.Foo
  • 您是在尝试使用自动映射器将属性从域对象复制到视图模型,还是我想念的东西?
  • @Omu:通常是的,但并非总是如此,因此问题
  • @VdesmedT:我正在将属性从视图模型复制到域模型(那里没有问题)。然后我验证域模型并收到一个或多个验证错误以及导致错误的属性名称。我希望能够将这些属性名称映射回它们的等效视图模型属性名称,这样我就可以让 MVC 在正确的控件旁边显示验证错误

标签: asp.net-mvc-2 automapper


【解决方案1】:
Mapper.GetAllTypeMaps()
  .First(x=>x.SourceType==typeof(CustomType))
  .DestinationType.Name

未经测试,“有效”只有 1 级深度,很可能只是失败。但可能会给出一些想法:

 public static string Get<T,TProp>(this T o,Expression<Func<T,TProp>> prop){
      var pn=((MemberExpression)prop.Body).Member.Name;
      var dt=Mapper.GetAllTypeMaps()
        .First(x=>x.SourceType==typeof(T));
      var pmaps=dt.GetPropertyMaps();
      var dpmap=pmaps.First(x=>x.DestinationProperty.Name==pn);
      return string.Format("{0}.{1}", //hyper dirty lol
        dt.DestinationType.Name,dpmap.DestinationProperty.Name);
 }

【讨论】:

  • 这将为特定源类型提供目标类型的名称。我在特定源属性的目标属性名称之后。例如。如果 MyAddress.AddressLine1 映射到 OtherAddress.ResidentialAddress.AddressLine1,那么我希望能够将“AddressLine1”传递给一个函数并让它返回“ResidentialAddress.AddressLine1”
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多