如何在automapper投影中使用Url.Content(“〜/ asdf”)

时间:2011-02-18 22:22:38

标签: asp.net-mvc-3 automapper

我尝试在自动投影器投影中使用UrlHelper的Content方法,但在第一次请求后失败。

我的地图创建代码如下所示:

protected override void Initialize(RequestContext requestContext) {
  base.Initialize(requestContext);

  Mapper.CreateMap<MyObject, MyMappedObject>()
    .ForMember(dest => dest.Url, opt => opt.MapFrom(src => Url.Content("~/something/") + src.Id));
}

第一个请求正常,但后续请求会抛出NullReferenceException并带有以下堆栈跟踪:

at System.Web.HttpServerVarsCollection.Get(String name)
at System.Web.Mvc.UrlRewriterHelper.WasThisRequestRewritten(HttpContextBase httpContext)
at System.Web.Mvc.UrlRewriterHelper.WasRequestRewritten(HttpContextBase httpContext)
at System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext, String contentPath)
at System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext, String contentPath)
at System.Web.Mvc.PathHelpers.GenerateClientUrl(HttpContextBase httpContext, String contentPath)
at System.Web.Mvc.UrlHelper.GenerateContentUrl(String contentPath, HttpContextBase httpContext)
at System.Web.Mvc.UrlHelper.Content(String contentPath)

有趣的是,如果我在映射之前缓存Url.Content()部分,那么一切正常:

protected override void Initialize(RequestContext requestContext) {
  base.Initialize(requestContext);

  var url = Url.Content("~/something/");
  Mapper.CreateMap<MyObject, MyMappedObject>()
    .ForMember(dest => dest.Url, opt => opt.MapFrom(src => url + src.Id));
}

btw这段代码是简化的,但是对于我的用例,它被用作json响应的一部分,因此我无法将Url.Content()部分移动到视图中。

这是一个自动播放器问题,一个MVC问题,还是更可能是我做错了什么?除了在映射代码之前“缓存”变量中的url部分之外,是否有更清晰的解决方案?

1 个答案:

答案 0 :(得分:0)

Mapper.CreateMap<TSource, TDest>()

每个应用域只应执行一次,完全在Application_Start中的Global.asax方法中完成。你在这里做的是每次初始化控制器时都重新定义映射规则,这是不正确的。这样做的好地方是使用custom resolver