请注意,本站并不支持低于IE8的浏览器,为了获得最佳效果,请下载最新的浏览器,推荐下载 Chrome浏览器
欢迎光临。交流群:166852192

使用ContainablePart 时获得的两个错误处理参考


最近一直有这两个错误
1、Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法将类型“Orchard.Core.Containers.Models.ContainablePart”隐式转换为“Orchard.ContentManagement.ContentItem”
   在 CallSite.Target(Closure , CallSite , Object )
   在 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
   在 CallSite.Target(Closure , CallSite , Object )
   在 Orchard.DesignerTools.Services.WidgetAlternatesFactory.<>c.<Displaying>b__0_0(ShapeDisplayingContext displayedContext)
   在 Orchard.DisplayManagement.Implementation.DefaultDisplayManager.<>c__DisplayClass15_0.<Execute>b__3(Action`1 action)
   在 Orchard.InvokeExtensions.Invoke[TEvents](IEnumerable`1 events, Action`1 dispatch, ILogger logger)
2、System.NullReferenceException: 未将对象引用设置到对象的实例。
   在 Orchard.Lists.Shapes.<Discover>b__2_2(ShapeDisplayingContext context)
   在 Orchard.DisplayManagement.Implementation.DefaultDisplayManager.<>c__DisplayClass15_0.<Execute>b__1(Action`1 action)
   在 Orchard.InvokeExtensions.Invoke[TEvents](IEnumerable`1 events, Action`1 dispatch, ILogger logger)
而这两个错误不是偶发性的,第一个是只要涉及ContainablePart 就会出现的错误,第二个是只要没有父容器container就报错。看这两个错误看烦了,今天刚好也有空,就决定处理一下。
先来解决第二个错误:
这个错误我发现是在下图中,方框内由于没有container,所以下一行中画线部分就报了个错。

为了解决这个问题,以及不改变网站源码的情况下,我就在自己的模块中,复制了该源码,并使用了 OrchardSuppressDependency这个属性。通过修改画线处的代码来解决问题。如下图,通过判定container是否为Null。OrchardSuppressDependency 属性在using Orchard.Environment.Extensions命名空间下,记得引用哦。





再来解决第一个问题。
也是在shape中引起的问题。源码图如下,在第一个断点(箭头所指位置报错)。

我试着去找Shape.ContentItem的赋值代码,可是太它妈艹蛋,没找着,引起这个错误的原因很简单,Shape.ContentItem是一个ContainablePart ,但要赋值给ContentItem类型,两着类型不一样,就引发了错误,实际应该给Shape.ContentItem赋值时赋ContainablePart.ContentItem,就不会出来这个问题,但是我前面说了,我没有找到赋值的地方,所以只好同上处理。
为了不改变源代码,不要问我为什么,你要是一直想给orchard保持在最新版本不断升级,你会发现你记不住源代码你改了哪里,那不是很麻烦,反正我记不住。
所以我一般都使用OrchardSuppressDependency这个属性。来屏蔽官方的代码,启用自己的替代代码。
处理如下:相信你能看不懂。不再多说。




作者原创内容不容易,如果觉得内容不错,请点击右侧“打赏”,赏俩给作者花花,也算是对作者付出的肯定,也可以鼓励作者原创更多更好内容。
更多详情欢迎到QQ群 166852192 交流。