需求描述:
現在乙個頁面有4個輸入框,每個輸入框都繫結有乙個驗證規則。要求在使用者輸入完畢後根據每個輸入的規則對使用者輸入進行驗證。而且這些驗證規則是使用者在後台可以動態更改的。如下圖所示:
最初的想法:
我們最初的想法使用正規表示式實現。後台資料庫中只要儲存驗證的正規表示式就行了。需要驗證的時候,從後台資料庫中取得對應的正規表示式即可。想法很好,就是真正到了實現的時候有點問題。比如上圖中的第乙個要求如果使用正規表示式來實現就會比較複雜,在網上查了一些資料也沒有發現比較通用的能夠檢測數字範圍的正規表示式。最要命的是上面第乙個是可以更改的,如果使用者突然哪一天更改為:>34.5 && < 999999.9 那這個正則又該怎麼寫呢?目前還沒有找到乙個比較通用的驗證數字範圍的正規表示式。所以這種不可行。
不過上面有一點肯定的是,將驗證規則提取到資料庫中達到可配置這個是一定的,只是現在缺少一種行之有效並且簡單的表示式。表示式啊表示式...突然想到lambda表示式不也是一種表示式麼,如果如果讓他來進行類似於範圍判斷的話也會簡單很多。例如,如果要進行上面的範圍判斷可以寫成:o=> o >100 && o < 499,比正規表示式不知道高到**去了。現在需要考慮的問題就是如何讓後台**從資料庫中取出這段lambda表示式,並且能夠成功執行返回結果。自然而然的想到了動態編譯這個詞,只要能夠動態編譯這些**片段,那麼就能執行並返回結果了。
動態編譯c#**
初步的想法有了,下面就是驗證其是否可行了。google了一番動態編譯c#**,在園子裡面搜尋到這篇文章 。很詳細的教程,在這裡謝謝作者。作者給出的**顯然還不能直接用到我們這裡。我們需要的介面應該是這樣的 bool validate(string lambda, string userinput); 第乙個引數是從資料庫取出的lambda表示式字串,第二個引數是使用者輸入的需要進行驗證的值。
static bool validateinput(string lambda, string input)通過compileassemblyfromsource這個方法就能動態編譯**了。因為需要用到lambda表示式,所以在建立csharpcodeprovider的時候指定編譯器的版本為3.5的。編譯完了之後,可以通過反射進行呼叫相應的動態編譯的方法。在本例中,我們需要重點注意的還是怎麼樣構造乙個可以執行lambda表示式的**片段。});// 2.icodecomplier
icodecompiler objicodecompiler = objcsharpcodeprivoder.createcompiler();
// 3.compilerparameters
compilerparameters objcompilerparameters = new compilerparameters();
objcompilerparameters.referencedassemblies.add("system.dll");
objcompilerparameters.referencedassemblies.add("system.core.dll");
objcompilerparameters.referencedassemblies.add("system.xml.linq.dll");
objcompilerparameters.generateexecutable = false;
objcompilerparameters.generateinmemory = false;
// 4.compilerresults
compilerresults cr = objicodecompiler.compileassemblyfromsource(objcompilerparameters, generatecode(lambda, input));
if (cr.errors.haserrors)
}else
return false;
}
static string generatecode(string lambda, string input)可以看到,我宣告了乙個validates方法,這個方法接受乙個委託func。輸入是字串,返回值是bool。然後再宣告乙個vlidate呼叫validates方法並傳入lambda。通過這樣的方式就可以成功動態編譯並執行我們指定的lambda表示式了。
關於效率
這段**既用到動態編譯,又用到反射效率上肯定不是太高。不過靈活性和效率向來就很難兼得。如果還有其他更好的兼得的方法歡迎不吝賜教!
輸入框輸入資料格式合法性驗證
檢查各重量輸入框輸入格式是否正確 mui mui input group on change valueneedcheck function false 整數或小數驗證 function checknumber input 0 9 if pattern.test input else 輸入車號合法性...
身份證合法性驗證
2015年10月14日 16 42 22 從網上扒的,刪掉了一小段無用 修改了一行判斷省份的 1 2 身份證號驗證 相容15,18位 3 4function checkidentitycode idcard 5 12 city array 13 11 北京 12 天津 13 河北 14 山西 15 ...
身份證合法性驗證
2015年10月14日 16 42 22 從網上扒的,刪掉了一小段無用 修改了一行判斷省份的 1 2 身份證號驗證 相容15,18位 3 4function checkidentitycode idcard 5 12 city array 13 11 北京 12 天津 13 河北 14 山西 15 ...