C# automapper能否生成url';s

C# automapper能否生成url';s,c#,asp.net-mvc,automapper,C#,Asp.net Mvc,Automapper,我想automapper生成一个视图模型的URL。例如,这是我的数据对象: public class User { public int Id { get; set; } public int Name { get; set; } } 视图模型如下所示: public class UserListItem { public string Name { get; set; } public string EditUrl { get; set; } } listIten.Edit

我想automapper生成一个视图模型的URL。例如,这是我的数据对象:

public class User
{
  public int Id { get; set; }
  public int Name { get; set; }
}
视图模型如下所示:

public class UserListItem
{
  public string Name { get; set; }
  public string EditUrl { get; set; }
}
listIten.EditUrl = Url.Action("Edit", "UserController", new { id = user.Id });
我希望使用为应用程序定义的路由生成
EditUrl
属性

大概是这样的:

public class UserListItem
{
  public string Name { get; set; }
  public string EditUrl { get; set; }
}
listIten.EditUrl = Url.Action("Edit", "UserController", new { id = user.Id });
似乎没有办法让AutoMapper做到这一点。没有可用于映射表达式的RequestContext、UrlHelper或任何内容,并且在调用Mapper.Map时,我还没有找到在上下文中传递的任何方法

我错过什么了吗?或者一开始就想这么做是个坏主意

更新:其他背景信息


我正在研究为MVC视图生成URL的替代方法,目的是使ASP.NET MVC应用程序维护尽可能简单。在映射viewmodels时生成URL是备选方案之一。测试和清理视图很容易。在某些情况下,它还将促进视图的可重用性。在尝试这个想法时,我遇到了一堵砖墙,AutoMapper无法接受
映射操作的任何类型(动态)上下文。

我认为这不是AutoMapper的工作

路由是特定于ASP.NET的,AutoMapper只适用于对象映射。它对HTTP上下文没有可见性(也不应该),因此无法完成

如果您想在多个地方“重用”这个逻辑,为什么不创建一个强类型的HTML助手呢

public static MvcHtmlString EditUserLinkForModel<UserListItem>(this HtmlHelper<UserListItem> htmlHelper)
{
   var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
   return urlHelper.Action("Edit", 
                           "UserController", 
                           new { id = htmlHelper.ViewData.Model.UserId });
}

尽管这可能也太过分了。这是一艘1号班轮

尽管这种方法会导致大量的可测试性问题,但还是可以做您想做的事情。。。利用HttpContext.Current.Request.RequestContext

Mapper.CreateMap<Sample1, Sample2>().ForMember(
                destination => destination.Url, options => options.MapFrom(source => new UrlHelper(HttpContext.Current.Request.RequestContext).Content(source.Url)));
Mapper.CreateMap().FormMember(
destination=>destination.Url,options=>options.MapFrom(source=>newurlhelper(HttpContext.Current.Request.RequestContext).Content(source.Url));

这将使测试变得困难,但您可以通过注入一个提供UrlHelper的类来解决这一问题。然后,如果可以模拟URL帮助器,那么您的测试问题就会得到缓解,或者至少可以删除它对HttpContext的依赖

我只是想分享一下我在这个话题上的发现。。。我使用自定义类型转换器(AutoMapper 3.1.1)解决了以下问题:


SourceObject中任何SomeEntity类型的属性现在都可以正确地转换为目标字符串属性(作为URL)。

@paolo否,这不是一个重复的问题。我不是在寻求一种在视图模型中获取请求上下文的方法。这可能是一个解决方案的开始。我很想听听你们的观点,为什么这不是AutoMapper应该能够做到的。我的意思是,应用HtmlEncode也是ASP.NET特有的,但这是许多人用AutoMapper做的事情。AutoMapper是否应该不够灵活,不允许我为实体生成url?毕竟,生成url只不过是将几个属性值映射到一个字符串,这正是AutoMapper真正擅长的。@Marnix-实际上,它不仅仅是“将几个属性值映射到一个字符串”。它需要考虑路由表,它只对http上下文可见。如果它只是映射到一个字符串,那么可以使用
opt=>opt.UseValue(“somestring”)
。我从未见过HtmlEncode在自动映射器中使用。但是再一次,这并不依赖于HTTP上下文。但是,我再一次感到困惑,你为什么要automapper这样做?为什么在视图或帮助器中生成URL如此困难?@RPM1984我希望AutoMapper这样做以获得更清晰的代码。我不想创建一堆HTML助手方法,我发现它们很快就会变得不可管理。用AutoMapper实现这一点对我来说似乎是一个非常干净的解决方案。至于在AutoMapper中使用HtmlEncode,这是在中提倡的。接受你的答案,因为我认为你是对的。除了将数据映射和格式化到viewmodels之外,Automapper(ab)不应用于任何其他用途。
Mapper.CreateMap<SomeEntity, string>().ConvertUsing<SomeEntityToUrlConverter>();
Mapper.Map<SourceObject[], DestinationObject[]>(items, opts => opts.Items.Add("Url", Url));