WSS自定义字段问题:在 RenderPattern 中使用自定义属性

时间:2022-12-30 14:54:18

字段配置文件如下:
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性FieldTypes

PropertySchema中声明了一个自定义属性:ExportTemplate,但是这个属性无法在RenderPattern中引用,如上面配置文件的写法,
<Property Select="ExportTemplate"/>输出始终为空。
反射系统的SPFileText的实现,它声明了类似的 MaxLength等属性:

WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性MaxLength

采用了 internal string SetFieldAttributeValue( string attrName, string attrValue) 方法添加属性,这种属性是可以在RenderPattern用
<Property Select="MaxLength"/>引用的。但是这个方法是internal的,我们的代码无法使用。
好在我们有反射,利用反射是可以调用一个类的非公共方法的。
我们重载SPField的 OnAdded和 OnUpdated方法,当自定义属性改变时同步到字段的标准属性:

WSS自定义字段问题:在 RenderPattern 中使用自定义属性public   override   void  OnAdded(SPAddFieldOptions op)
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
{
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            
base.OnAdded(op);WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            SyncProperty();          
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        }
WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
public   override   void  OnUpdated()
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
{
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            
base.OnUpdated();WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            SyncProperty();
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        }
WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <summary>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// 将自定义属性同步到Property,便于在fldtypes_文件中使用
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// </summary>

WSS自定义字段问题:在 RenderPattern 中使用自定义属性         void  SyncProperty()
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
if (GetAttributeValue(ExportTemplate_PropertyName) == this.ExportTemplate) return//防止递归WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            SetAttributeValue(ExportTemplate_PropertyName, 
this.ExportTemplate);WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            
this.Update();
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        }
WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <summary>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// 设置属性值,利用反射调用基类的internal方法
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// fldtypes_中的RenderPattern无法调用到 CustomProperty,所有把CustomProperty同步到Property
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// </summary>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <param name="name"></param>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <param name="value"></param>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <returns></returns>

WSS自定义字段问题:在 RenderPattern 中使用自定义属性         protected   string  SetAttributeValue( string  name,  string  value)
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
{  Type t = typeof(SPField);WSS自定义字段问题:在 RenderPattern 中使用自定义属性            object obj = t.InvokeMember("SetFieldAttributeValue", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性            
nullthisnew object[] { name , value });WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            
return "" + obj;
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        }
WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <summary>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// 获取属性值,利用反射调用基类的internal方法
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// </summary>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <param name="name"></param>
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
/// <returns></returns>

WSS自定义字段问题:在 RenderPattern 中使用自定义属性         protected   string  GetAttributeValue( string  name)
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性        
{
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            Type t 
= typeof(SPField);WSS自定义字段问题:在 RenderPattern 中使用自定义属性            object obj = t.InvokeMember("GetFieldAttributeValue", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
WSS自定义字段问题:在 RenderPattern 中使用自定义属性WSS自定义字段问题:在 RenderPattern 中使用自定义属性            
nullthisnew object[] { name });WSS自定义字段问题:在 RenderPattern 中使用自定义属性
WSS自定义字段问题:在 RenderPattern 中使用自定义属性            
return "" + obj;
WSS自定义字段问题:在 RenderPattern 中使用自定义属性        }

OK,问题解决。

关于自定义字段的开发可以参考以下文章:
http://www.cnblogs.com/shangmeizhai/archive/2007/04/15/714274.html

可能大家看得有点云里雾里(懒阿,没有好好去写~),但相信这篇文章对碰到同样问题的兄弟是有价值的。