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



    字段配置文件如下:
    FieldTypes

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

    MaxLength

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

    public override void OnAdded(SPAddFieldOptions op)
            
    {
                
    base.OnAdded(op);
                SyncProperty();          
            }

            
    public override void OnUpdated()
            
    {
                
    base.OnUpdated();
                SyncProperty();
            }

            
    /// <summary>
            
    /// 将自定义属性同步到Property,便于在fldtypes_文件中使用
            
    /// </summary>

            void SyncProperty()
            
    if (GetAttributeValue(ExportTemplate_PropertyName) == this.ExportTemplate) return//防止递归
                SetAttributeValue(ExportTemplate_PropertyName, 
    this.ExportTemplate);
                
    this.Update();
            }

            
    /// <summary>
            
    /// 设置属性值,利用反射调用基类的internal方法
            
    /// fldtypes_中的RenderPattern无法调用到 CustomProperty,所有把CustomProperty同步到Property
            
    /// </summary>
            
    /// <param name="name"></param>
            
    /// <param name="value"></param>
            
    /// <returns></returns>

            protected string SetAttributeValue(string name, string value)
            
    {  Type t = typeof(SPField);            object obj = t.InvokeMember("SetFieldAttributeValue", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
                
    nullthisnew object[] { name , value });
                
    return "" + obj;
            }

            
    /// <summary>
            
    /// 获取属性值,利用反射调用基类的internal方法
            
    /// </summary>
            
    /// <param name="name"></param>
            
    /// <returns></returns>

            protected string GetAttributeValue(string name)
            
    {
                Type t 
    = typeof(SPField);            object obj = t.InvokeMember("GetFieldAttributeValue", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
                
    nullthisnew object[] { name });
                
    return "" + obj;
            }

    OK,问题解决。

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

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



  • 相关阅读:
    Android学习---- 十月
    第17章 使用PHP和MySQL实现身份验证
    第13章 MySQL高级编程
    第12章 MySQL高级管理
    第11章 使用PHP从Web访问MySQL数据库
    第10章 使用MySQL数据库
    第9章 创建Web数据库
    第5章 代码重用与函数编写
    NOIP模拟赛-奶牛晒衣服(dry)
    BZOJ1008 /乘法原理+快速幂 解题报告
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/1021707.html
Copyright © 2020-2023  润新知