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

时间:2013-08-09 10:01:26

标签: episerver episerver-7

我一直在加速EPiServer 7 MVC,并经历了Joel Abrahamsson的Alloy MVC Template。在看了自定义预览控制器之后,它预览了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”]作为字符串]);该方法不支持lambda表达式中的索引或方法调用)。 有谁知道如何创建这样的内联编辑器?

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

也许一种可行的方法是:

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

  1. 一个名为大小的字符串属性,其中 SelectOne 属性为 SelectionFactory 配置,返回有效大小边界选项
  2. 实际标题文字的另一个字符串属性标题
  3. 接下来,您可以添加 ContentArea ,并将允许的类型设置为 SizeSpecificHeadingBlock

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

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

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

    修改:虽然目前处于测试阶段,但对于此类情况,可能需要使用 PropertyList< YourCustomType> ,以避免必须创建嵌套块: http://world.episerver.com/blogs/Per-Magne-Skuseth/Dates/2015/11/trying-out-propertylistt/