zoukankan      html  css  js  c++  java
  • 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

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



  • 相关阅读:
    【MVC 1】MVC+EF实体框架—原理解析
    数据结构导论(一)
    【JavaScript 14—学习总结】:从小事做起
    【JavaScript 13—应用总结】:锁屏遮罩
    【JavaScript 12—应用总结】:弹出登录框
    【JavaScript 11—应用总结】:下拉菜单
    【JavaScript 10—应用总结】:连缀
    【EF 1】EF实体框架 原理+实例
    【多 线 程】
    【命 令 行】
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/1021707.html
Copyright © 2011-2022 走看看