• NewsPic01

orchard如何访问content part及content field

发布时间:2014/08/20 14:39

在orchard模块开发及主题开发中经常需要访问我们自定义contentType的  contentPart 和  contentField, 那么如何访问呢?

 https://orchard.codeplex.com/discussions/398270 (orchard开发者回复如何访问contentfield)

对于part  访问很简单,   如果得到一个Content类型的变量   c1, 那么访问它的标题是   c1.As<TitlePart>().Title; 关键就是这个As方法.  那么如何访问contentField 呢,情况复杂很多.

当我们在后台界面上往contenttype上添加field 时,感觉field是直接添加到 contenttype上的, 其实不然. sfmskywalker 告诉我们:  orhcard 在向contentType中添加field时,实际上添加了一个和contenttype 同名的 contentpart, 然后再向此同名的part中添加field .

所以contentfield不能直接添加到 contenttype中 ,只能添加到 contentpart中 (在ui中添加时,orchard自动生成一个和type同名的part!!!!!) 

由于我们此part在模块中并不对应一个真实的类. 所以我们无法用 As方法调用此Part, 那么又如何取得这个field呢? 

var field = ((dynamic)contentItem).MyPart.MyField;            //如果在cshtml模板中 Model.ContentItem 本身就是 dynamic 因此不必转换dynamic
field.Value = "Some value";

其实是先将ContentItem类型的实例强转成dynamic ,然后利用它的TryGetMember方法来动态访问同名的Part !!!  再访问到field后,即可get 和 set 这个field的值 并且会持久到数据库中 .

相关代码请看

Modules\Orchard.ContentTypes\Controllers\AdminController.cs 中的 AddFieldToPOST 方法, 此方法判断如果同名的part不存在,则创建同名的part,然后向此part中添加field .!!

深圳市聚乾科技开发有限公司
Copyright © 2013-2017 . 聚乾科技 版权所有