您的位置:知识库 » .NET技术

从丑陋到优雅,让代码越变越美续集之服务器端数据校验

作者: KenBlove  来源: 博客园  发布时间: 2009-04-02 11:31  阅读: 1907 次  推荐: 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 验证

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻