EPiServer 7 - 基于字典的自定义属性类型

Phi*_*tle 6 episerver episerver-7

我一直在加速EPiServer 7 MVC并且已经通过了Joel Abrahamsson的Alloy MVC模板.在看了自定义预览控制器之后,它预览了4种不同"尺寸"的块,它可以渲染,我有一个想法是创建一个特定于某个块"大小"的属性,以便标题文本,例如,可以根据块渲染的"大小"显示不同的内容.从本质上讲,这将是一个字典,其中Key是'size',Value将包含字符串内容.

有没有人制作过这样的词典属性?

我已经尝试了一些方法并且每个方法都遇到了问题:

  1. 自定义属性类型/自定义值类型.按照创建自定义属性类型的示例(http://joelabrahamsson.com/creating-a-custom-episerver-property-with-a-custom-class-as-value/),我创建了一个自定义属性类型(PropertyDicitionaryString) )和自定义值类型(DictionaryString).我可以通过实现显示模板来显示值,该显示模板接收具有大小的标签,然后将Model.MyDictionaryString [ViewData ["Tag"]呈现为字符串].但是,我还没有弄清楚如何让内联编辑工作,因为不支持调用@ Html.EditAttributes(x => x.MyDictionaryString [ViewData ["Tag"] as string]); 该方法不支持lambda表达式中的索引或方法调用). 有谁知道如何创建这样的内联编辑器?

  2. 自定义属性类型/基元类型.我重写了上面的自定义属性类型,让我们调用它(PropertyDictionaryStringAsPrimitive),以便Value属性返回一个字符串.这允许我将我的模型定义为:

    [BackingType(typeof(PropertyDictionaryStringAsPrimitive)] public virtual string SizeSpecificString{get;set;}

    当调用Value方法以确保它返回正确的值时,我不得不破解PropertyDictionaryStringAsPrimitive以便在当前渲染上下文中接收'size'.我能够通过实现自定义ContentDataInterceptor来实现这一点,该ContentDataInterceptor查找对PropertyDictionaryStringAsPrimitive.Value的调用并适当地设置Key.所以现在显示的值工作正常,但内联编辑也不太有效.当进行ajax保存调用时,我需要添加一些状态信息,这样我就可以告诉PropertyDictionaryStringAsPrimitive使用哪个Key来保存更改. 任何人都知道如何在内联编辑ajax保存请求期间传回其他状态信息?

  3. 我看了看[CultureSpecific]属性.如果我可以使用与CultureSpecific类似的机制来保持值的"大小"特定实例,那将会很有趣.在反编译器中花费一些时间试图解决hwo CultureSpecific的神奇之处,我将属性跟踪到CotnentDataAttributeScanningAssigner.AssignValuesToPropertyDefinition,将PropertyDefinitionModel.CultureSpecific标志设置为true,PropertyDefinitionSynchronizer.CreatePropertyDefintion用于将PropertyDefintiionModel.CultureSpecificValue设置为Enum.但是我找不到这个设置如何影响加载哪个值. 任何人都知道如何使用属性级别属性动态更改值?

Ted*_*erg 3

我通常避免自定义属性类型,我更喜欢坚持使用自定义编辑器(如果需要)和属性值的块属性(或内容区域中的块)。

也许一个可行的方法是:

1) 创建像SizeSpecificHeadingBlock这样的块类型:

  1. 名为Size的字符串属性,具有为SelectionFactory配置的SelectOne属性,返回有效的大小边界选项
  2. 实际标题文本的另一个字符串属性Heading

接下来,您可以添加一个ContentArea,并将AllowedTypes设置为SizeSpecificHeadingBlock

渲染 ContentArea 时,您只需渲染当前大小的标题即可。

但是,这需要编辑者为每个标题变体创建一个块,这有点麻烦 - 但您可以使用自定义编辑器来补充此方法以简化流程。

使用本机方式存储属性值(而不是自定义属性类型)可以使您的实现更加面向未来。此外,如果您的自定义编辑器出现故障,您可以随时禁用它并仅使用“vanilla”EPiServer UI 来编辑您的属性值。

编辑:虽然目前处于测试阶段,但对于这种情况,使用PropertyList<YourCustomType>可能是相关的,以避免创建嵌套块: http: //world.episerver.com/blogs/Per-Magne-Skuseth /日期/2015/11/试用-propertylistt/