程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> XAF實現運行時填加驗證規則並保存到數據庫中,xaf數據庫

XAF實現運行時填加驗證規則並保存到數據庫中,xaf數據庫

編輯:C#入門知識

XAF實現運行時填加驗證規則並保存到數據庫中,xaf數據庫


 

有幾種方法可以用來聲明一個驗證規則。最常用的方法是使用對應的Attribute來定義。詳見這裡。驗證模塊還允許您通過在業務類實現 IRuleSource 接口定義自定義的驗證規則的來源。 IRuleSource 接口公開兩個成員。名稱屬性應返回自定義的驗證規則源的唯一名稱。CreateRules 方法應實例化自定義的驗證規則。 一個場景中,您可能需要實現自定義驗證規則來源執行驗證規則存儲在數據庫中。可以使用這種方法,當您需要頻繁地自定義驗證規則在已部署的應用程序中,但您不能重新部署應用程序或自定義其應用程序模型。 下面的示例闡釋了此方案。  

此示例所示的 RuleRequiredFieldPersistent 類是一個普通的業務類。類實現 IRuleSource 接口,並用於創建和存儲在數據庫中的 RuleRequiredField 驗證規則。在 CreateRules 方法中實例化一個 RuleRequiredField 驗證規則,基於 RuleRequiredFieldPersistent 類的公共屬性的值。RuleRequiredFieldPersistent 類標記 DefaultClassOptionsAttribute,以便最終用戶可以手動創建驗證規則通過相應的列表視圖。

 

[DefaultClassOptions]
public class RuleRequiredFieldPersistent : BaseObject, 
    DevExpress.Persistent.Validation.IRuleSource {
    public RuleRequiredFieldPersistent(Session session) : base(session) { }
    public string RuleName {
        get { return GetPropertyValue<string>("RuleName"); }
        set { SetPropertyValue("RuleName", value); }
    }
    public string CustomMessageTemplate {
        get { return GetPropertyValue<string>("CustomMessageTemplate"); }
        set { SetPropertyValue("CustomMessageTemplate", value); }
    }
    public bool SkipNullOrEmptyValues {
        get { return GetPropertyValue<bool>("SkipNullOrEmptyValues"); }
        set { SetPropertyValue("SkipNullOrEmptyValues", value); }
    }
    public string Id {
        get { return GetPropertyValue<string>("Id"); }
        set { SetPropertyValue("Id", value); }
    }
    public bool InvertResult {
        get { return GetPropertyValue<bool>("InvertResult"); }
        set { SetPropertyValue("InvertResult", value); }
    }
    public string ContextIDs {
        get { return GetPropertyValue<string>("ContextIDs"); }
        set { SetPropertyValue("ContextIDs", value); }
    }
    public string Property {
        get { return GetPropertyValue<string>("Property"); }
        set { SetPropertyValue("Property", value); }
    }
    [Persistent("ObjectType")]
    protected string ObjectType {
        get {
            if(ObjectTypeCore != null) {
                return ObjectTypeCore.FullName;
            }
            return "";
        }
        set { ObjectTypeCore = ReflectionHelper.FindType(value); }
    }
    [NonPersistent]
    [TypeConverter(typeof(DevExpress.Persistent.Base.LocalizedClassInfoTypeConverter))]
    public Type ObjectTypeCore {
        get { return GetPropertyValue<Type>("ObjectTypeCore"); }
        set { SetPropertyValue("ObjectTypeCore", value); }
    }
    #region IRuleSource Members
    public System.Collections.Generic.ICollection<IRule> CreateRules() {
        System.Collections.Generic.List<IRule> list = new System.Collections.Generic.List<IRule>();
        RuleRequiredField rule = new RuleRequiredField();
        rule.Properties.SkipNullOrEmptyValues = this.SkipNullOrEmptyValues;
        rule.Properties.Id = this.Id;
        rule.Properties.InvertResult = this.InvertResult;
        rule.Properties.CustomMessageTemplate = this.CustomMessageTemplate;
        rule.Properties.TargetContextIDs = new ContextIdentifiers(this.ContextIDs);
        rule.Properties.TargetType = this.ObjectTypeCore;
        if(rule.Properties.TargetType != null) {
            foreach(PropertyInfo pi in rule.Properties.TargetType.GetProperties()) {
                if(pi.Name == this.Property) {
                    rule.Properties.TargetPropertyName = pi.Name;
                }
            }
        }
        for(int i = Validator.RuleSet.RegisteredRules.Count - 1; i >= 0; i--) {
            if(Validator.RuleSet.RegisteredRules[i].Id == this.Id) {
                Validator.RuleSet.RegisteredRules.RemoveAt(i);
            }
        }
        list.Add(rule);
        return list;
    }
    [Browsable(false)]
    public string Name {
        get { return this.RuleName; }
    }
    #endregion
}

可以看到,這個示例中,只返回了一個規則,而在實際項目中,可以使用BO定義一個子集合,集合中定義N種規則。

不要定義N個BO並都實現 IRuleSource 那樣有點浪費。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved