我尝试在自动投影器投影中使用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部分之外,是否有更清晰的解决方案?
答案 0 :(得分:0)
Mapper.CreateMap<TSource, TDest>()
每个应用域只应执行一次,完全在Application_Start
中的Global.asax
方法中完成。你在这里做的是每次初始化控制器时都重新定义映射规则,这是不正确的。这样做的好地方是使用custom resolver。