【问题标题】:Query Orchard CMS from IShapeFactoryEvents从 IShapeFactoryEvents 查询 Orchard CMS
【发布时间】:2011-09-13 14:25:59
【问题描述】:

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

    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");
            }
        }
    }

再次感谢您。你们太棒了。

【问题讨论】:

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


    【解决方案1】:

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

    来自博文:

    “我需要注意一件事,这花了我一整天的时间才发现,你不能只将数据服务注入到你的 IShapeTableProvider 实现中。如果你这样做了,它会尝试使用事务输出范围,这会给你带来各种各样的问题。经过几个小时的努力,我终于发现了 Orchard 团队在 CoreShapes 类中所做的事情:通过使用解决函数本身内的服务依赖关系的技巧按请求加载服务的属性。”

    尝试像这样使用您的服务:

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

    【讨论】:

    • 感谢@chris-bower,辛苦了。您的网站进展如何?已经投入生产了吗?
    • @Chris 另一种解决方案是将Work&lt;T&gt; 而不是T 注入IShapeTableProvider 实现ctor。然后,您可以通过Work&lt;T&gt;Value 属性访问底层对象。它返回一个适合当前上下文的实例。当您需要将每个请求的依赖项注入单例依赖项时很有用。
    • @pszmyd - 不错。这是在 1.2 中添加的吗?我一定错过了。
    • 在从计划任务处理程序查询 cms 时会遇到类似的问题吗? @Chris 我过去实际上已经检查过你的博客和你的网站。看起来不错,果园证明自己很好?我正在尝试为我的组织公共网站 (www.nib.com.au) 出售它,但不确定是否能到达那里。
    • @Brendan - 计划任务在事务内部运行(在 1.2 中它们都在相同的情况下)。您可以很好地查询数据库。但是,如果任何其他计划任务发生故障,任何更新(低于 1.2)都将回滚。但是,是的,Orchard 对我们来说运作良好。我打算在不久的将来尝试写一个案例研究。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多