數據驗證是應用程序開發中使用頻率最高的功能模塊,本節詳細介紹一下XAF中如何使用驗證模塊。
XAF 驗證模塊內置了下面的一些驗證規則:
驗證規則類型
說明
為了更直觀的理解,我們先上一個效果圖。從必填驗證說起:
如上圖所示,在按下了保存、保存關閉、保存新建 按鈕之後,會出現一個錯誤提示信息。同時,在姓名文本框前面會出現一個紅色報錯的圖標。這個效是怎麼實現的呢?
public class 客戶........
{
....................
private string _姓名; [RuleRequiredField(CustomMessageTemplate ="請填寫姓名!")] public string 姓名 { get { return _姓名; } set { SetPropertyValue("姓名", ref _姓名, value); } }
...................
我在前面使用的項目中,打開了客戶.cs文件,並在客戶類的姓名屬性上增加了一行
[RuleRequiredField(CustomMessageTemplate ="請填寫姓名!")]
是的只需要這樣一行就可以了。
這樣,XAF為我們生成了一條驗證規則,規則的名稱是自動指定的,一系列相關的也都用了默認值,我們修改一下代碼,指定下名稱:
[RuleRequiredField("客戶姓名必填", DefaultContexts.Save,CustomMessageTemplate ="請填寫姓名!")]
第一個參數為規則的名稱,DefaultContexts.Save是指在保存這個上下文時才執行驗證。
編譯後,打開xafml文件,可以看到這麼規則的所有信息:
按照左側紅框中的路徑,最終點擊結點“客戶姓名必填”後,右側出現了此規則的詳細信息,其中格式這一分組內的設置都是顯示消息類的。可以進行一下漢化。
帶有地球圖標的,都是需要本地化的屬性。
行為一欄中:
InvertResult:反轉結果,當設置為True時,即驗證的結果如果是沒通過,則認為通過,即是否通過的結果取反,這個選項在必填驗證是沒什麼用的,我們不可能做一個驗證規則要實現某些屬性必須不能填值的。
ResultType:Error,Warning,Information三種,其中:
Error:當不滿足驗證規則時,報個錯誤出來,並且不能繼續操作程序。上面演示的驗證規則就是這樣效果了。
Warning:當不滿足驗證規則時,顯示一個警告信息,確認後,繼續程序運行。
比如:客戶信息中有個地址屬性,當然我們是希望填寫地址的,如果不填寫,有市場活動舉行時,我們有一些禮品就沒辦法寄送給客戶。此時,我們可以增加一條這樣的規則,但如果確定得不到地址,也只能不填寫了,但要提示操作人員。
按下保存時,可以看到地址文本框前面出現了一個黃色感歎號圖標。在錯誤信息提示的位置,出現了一個checkbox,文字是Ignore warnings,當選中了checkbox後,再次按保存時,則不在提示此信息了。
下面我們再來看看將ResultType修改為Information時的效果:
代碼:
private string _地址; [RuleRequiredField(ResultType = ValidationResultType.Warning,CustomMessageTemplate ="如果不填寫地址,市場活動禮品將無法送達,確認不填寫嗎?")] public string 地址{ get { return _地址; } set { SetPropertyValue("地址", ref _地址, value); } }
由於姓名沒有填寫,觸發了必填規則,同時顯示出了地址的信息,但可以不去糾正,只是顯示出信息。
當,姓名填寫了時,地址的消息是不會顯示的,此時,點擊Validation按鈕會看到提示信息:
private string _地址; [RuleRequiredField(ResultType = ValidationResultType.Information,CustomMessageTemplate ="如果不填寫地址,市場活動禮品將無法送達,確認不填寫嗎?")] public string 地址{ get { return _地址; } set { SetPropertyValue("地址", ref _地址, value); } }
接下來看xafml中規則的 SkipNullOrEmptyValues,這個選項在必填驗證時沒有意義,但在別的規則中是有意義的,比如:地址必須以“上海市”開頭,如果沒有填寫則不驗證,那麼把此值設置成True即可。
代碼:
private string _地址; [RuleRequiredField(ResultType = ValidationResultType.Information,CustomMessageTemplate ="如果不填寫地址,市場活動禮品將無法送達,確認不填寫嗎?")] [RuleStringComparison("地址必須開始於上海市", DefaultContexts.Save, StringComparisonType.StartsWith,"上海市",SkipNullOrEmptyValues =true)] public string 地址{ get { return _地址; } set { SetPropertyValue("地址", ref _地址, value); } }
如果沒有填寫地址時,規則並不會生效。保存是直接通過的,這就是SkipNullOrEmptyValues的作用。
TargetContextIDs:這個屬性是個字會串,可以隨意填寫。首先來看一下什麼是Context,即上下文:
上下文是指讓驗證規則生效的一個環境,比如保存數據時,審核數據時,刪除數據時,入庫時,等等 ,但系統其實只提供了兩個默認的上下文環境,我們前面使用了
DefaultContexts.Save 這個枚舉,可以看他的定義(我使用的是Reflector查看的):
[Flags] public enum DefaultContexts { Delete = 2, Save = 1 }
可以看到這個枚舉是Flags,也就是說,多個值是可以同時使用的。只定義了刪除、保存。
系統內置的上下文環境只有這兩種,當然我們可以定義自己的上下文環境,請看下一節中的自定義上下文。
我們可以看到在xafml的規則中,有很多的屬性,其實在代碼中這些屬性都是可以控制的,在書寫Attribute時,我們可以利用VS的智能感知,查看有哪些參數可以設置,對照著XAFML中的信息,就能知道功能了。