從丑陋到優雅,讓代碼越變越美續集之服務器端數據校驗

作者: KenBlove  來源: 博客園  發布時間: 2009-04-02 11:31  閱讀: 1817 次  推薦: 0   原文鏈接   [收藏]  
 

    數據校驗是兩方面的,客戶端校驗雖然可以大大減少服務器回調次數提升用戶體驗.但是客戶端校驗并不是萬能 的,從原理上說,客戶端返回的數據都是不可信任的,服務器端校驗必不可少。(關于客戶端校驗的總結:從丑陋到優雅,讓代 碼越變越美(客戶端檢測方法思考) )

   總的來說,服務器端代碼也經歷了相似的幾個過程:

   以判斷一個輸入是否是可以轉換成整數為例,開始大家都會續項強寫:

Code1
string str = txtTest.Text;
if  (!string.IsNullOrEmpty(str))
{
    
int? intResult = 0;
    
if (int.TryParse(str
out intResult))
     {
        
if (intResult>0 && intResult<100)
         {
            
//success
        }
        
else
         {
            ShowMessage (
"輸入必須大于0小于100");
        }
    }
    
else
     {
        ShowMessage(
"不能格式化 為Int類型");
    }
}

else
{
    ShowMessage(
"輸入為空");
}

  看著就夠麻煩,然后大家都會總結經驗,將檢測寫成一個一個的函 數:

Code2
protected bool IsInt(string str)
{
    
if (!string.IsNullOrEmpty(str))
    {
        
int? intResult = 0;
        
if  (int.TryParse(str
out intResult))
         {
            
return true;
        }
    }

    
return false;
}


protected bool IsInRange(int max
int minint input)
{
    
if (input > min && input < max)
        
return true;
    
else
        return false;
}

  然后輕松調用:

Code3
if (IsInt (str))
{
    
if(IsInRange(100
0int.Parse (str))
    {
        
//success
    }
    
else
     {
        ShowMessage(
"輸入必須大 于0小于100");
    }
}

else
{
    ShowMessage(
"不能格式化為Int 類型");
}

  這樣界面果然清爽多了..但是這樣就滿足了嗎? 當然不是,這樣的寫法還是有很多缺點的,例如一大堆各種類型的判斷函數很難記得住,加的方法多了還很容易重復,還有例如隨著判斷 條件的增多那一堆"If"就讓人火大~不優雅啊!!在這個追求優雅的時代,怎么能讓這樣的代碼出在我們追求完美的人的手中? 一定要干 掉它們!

  下面,我們就介紹一種經過改良的客戶端檢測解決方案:

Code4
vInfo info = vHelper.StartVerify (txtTest.Text)
    .IsNotNullOrEmpty(
"輸入為空 ")
    .IsInt(
"不能格式化為Int 類型")
    .Min(
0
"輸入小于0")
    .Max(
100
"輸入大于100")
    .EndVerify();

ShowMessage(info);

  上邊 這個是檢測字符串是否只能轉換成int并在0到100范圍的.下邊這個是檢測int類型是否屬于0到100范圍的.

Code5
vInfo info = vHelper.StartVerify (10)
    .IsNotNullOrEmpty(
"輸入 為空")
    .Min(
0
"輸入小于0")
    .Max(
100
"輸入大于100")
    .EndVerify();

ShowMessage(info);

  相似吧? 無論在檢測的數據是任何類型,都只是同一種寫法,淺顯易記又優雅(囧!),返回的vInfo是一個貧血的實體類:

Code6
public class vInfo
{
    
private bool _Status;

    
public bool Status
     {
        
get  { return _Status; }
        
set  { _Status = value; }
    }

    
private string _Message;

    
public string Message
     {
        
get  { return _Message; }
        
set  { _Message = value; }
    }
}

 

0
0
 
標簽:ASP.NET 驗證
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()