从IShapeFactoryEvents查询Orchard CMS

时间:2011-09-13 14:25:59

标签: asp.net-mvc asp.net-mvc-3 content-management-system orchardcms

我尝试在启用后从模块中将形状插入到布局中。我认为IShapeFactoryEvents是完美的,但是如果在POST期间发生这种情况,从这里查询CMS会给我一个“TransactionScope嵌套错误异常”。想知道是否有人再次对我有任何智慧的话语?请参阅下面的代码段。

    public void Created(ShapeCreatedContext context)
    {
        if (context.ShapeType == "Layout")
        {                
            if (!AdminFilter.IsApplied(_services.WorkContext.HttpContext.Request.RequestContext))
            {
                var route = RouteTable.Routes.GetRouteData(_services.WorkContext.HttpContext);
                object location;
                if (route.Values.TryGetValue("location", out location))
                {
                    var region = _services.ContentManager.Query("Region")
                        .Join<RoutePartRecord>()
                        .Where(x => x.Slug == (string)location)
                        .Slice(1).FirstOrDefault();

                    context.Shape.Header.Add(context.New.CurrentRegion(Title: region.As<RoutePart>().Title), "10");
                }
                context.Shape.Navigation.Add(context.New.RegionSelector(Regions: _services.ContentManager.Query(VersionOptions.Published, "Region").List()), "11");
            }
        }
    }

再次提前感谢。你们真棒。

1 个答案:

答案 0 :(得分:1)

请参阅我在此主题上所做的博文:http://chrisbower.com/2011/02/15/orchard-shape-wizardry/

来自博文:

  

“有一件事我需要注意,这花了我一整天才发现,是你不能只将数据服务注入IShapeTableProvider实现。如果你这样做,它会尝试使用一个事务范围,这将导致你各种各样的问题。在我的头发结束几个小时后,我终于发现了Orchard团队在CoreShapes类中做了什么:通过使用解决函数本身内的服务依赖性的技巧每个请求加载服务的属性。“

请尝试使用此类服务​​:

private IOrchardServices Services     
{
    get
    {
        return _workContextAccessor.GetContext(_httpContextAccessor.Current()).Resolve<IOrchardServices>();
    }
}