posts - 69, comments - 296, trackbacks - 21, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

GridView 数据异动前的字段检查

Posted on 2008-06-13 15:54 jeff377 阅读(1324) 评论(6)  编辑 收藏 所属分类: ASP.NET 基础DataSource 控件GridView

摘要
一般执行新增/修改完毕准备异动数据库前,通常会做一层数据正确性检查的动作;当我们使用 GridView 系结 SqlDataSoruce 来呈现数据,若 GridView 进行数据编辑存盘前也要做字段值的检查应该在如何做呢?应该在那个控件的那个事件去处理这个检查动作呢?

程序说明及实作
首先在页面上放置一个 GridView 及 SqlDataSource 控件,GridView 设为可编辑状态。





当 GridView 编辑储存时,我们要先做一些字段值正确性的检查动作,以下的范例为测试示范,只判断 LastName 字段不得为空,这种必填字段的判断一般只要使用 RequiredFieldValidator 控件在 Client 端即可。

方法一:在 GridView 的 RowUpdating 事件处理字段检查
GridView 在编辑储存前会引发 RowUpdating 事件,我们可以在此事件中处理字段检查,字段检查的程序代码如下。当字段检查不合法时,设定 e.Cancel = True 即可中断数据更新的动作。

    Protected Sub GridView1_RowUpdating(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
        
Dim sScript As String

        
If String.IsNullOrEmpty(e.NewValues.Item("LastName")) Then
            sScript 
= "alert('LastName 欄位不得為空')"
            
Me.ClientScript.RegisterStartupScript(Me.GetType, "error", sScript, True)
            e.Cancel 
= True
        
End If
    
End Sub

执行程序,故意将 LastName 清空,然后按 [更新] 钮进行储存,字段检查的动作就被执行了。



方法二:在 SqlDataSource 的 Updating 事件处理字段检查
对于 SqlDataSource 来说,编辑数据异动数据库之前,会引发 SqlDataSource 的 Updating 事件,字段检查的程序代码如下。当字段检查不合法时,设定 e.Cancel = True 即可中断数据更新的动作,这种方式的执行结果跟上个作法一样。

    Protected Sub SqlDataSource1_Updating(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles SqlDataSource1.Updating
        
Dim sScript As String
        
If String.IsNullOrEmpty(e.Command.Parameters("@LastName").Value) Then
            sScript 
= "alert('LastName 欄位不得為空')"
            
Me.ClientScript.RegisterStartupScript(Me.GetType, "error", sScript, True)
            e.Cancel 
= True
        
End If
    
End Sub


结论

以上的说明可以知道在 GridView.RowUpdating 事件及 SqlDataSource.Updating 事件都可以处理字段检查,在那个地方处理比较好呢?答案是由数据源头的 SqlDataSource 控件来处理会比较好,主要原因如下:
1.尽量不要在 UI 控件处理数据验证动作,因为一旦更换其它 UI 控件(如更换其它厂商开发的 GridView 控件),程序代码就又要改写。
2.不同的 UI 控件系结 SqlDataSource 控件,都可以适用相同方法。例如 FormView 及 GridView 不同的 UI 控件,都可以在 SqlDataSource.Updating 统一处理。
3.如果直接使用 SqlDataSource.Update 方法去执行更新动作,不会引发 UI 控件的相关事件,但是一样会引发 SqlDataSource.Updating 事件。

Feedback

#1楼    回复  引用  查看    

2008-06-13 17:12 by kiler      
用模板列的话很简单,加一个验证控件就行了。

#2楼 [楼主]   回复  引用  查看    

2008-06-13 17:47 by jeff377      
@kiler
我知道....文章中有说明了,这只是为了测试中间层验证的动作而已,不是真的要在中间层做空字符串的验证。

#3楼    回复  引用  查看    

2008-06-13 18:35 by chenyaping      
效果很好!

#4楼    回复  引用  查看    

2008-06-13 21:11 by 恋恋风尘      
数据校验放在GridView.RowUpdating 中比放在SqlDataSource.Updating 中要好。
1.数据校验放在离用户输入数据的地方越近越好。
2.楼主的理由是“尽量不要在 UI 控件处理数据验证动作,因为一旦更换其它 UI 控件(如更换其它厂商开发的 GridView 控件),程序代码就又要改写”,看似很有道理,其实替换GridView的概率远远小于替换SqlDataSource的概率。

#5楼 [楼主]   回复  引用  查看    

2008-06-13 21:53 by jeff377      
@恋恋风尘
除了可以在Client端使用JavaScript处理的简单验证外,我还是认为应该尽量往底层处理数据验证的动作。
例如你在GridView做验证,当程序代码中有使用到SqlDataSource.Update在异动数据,那不就还要再重复写一次了吗?
若是系统是属性三层式架构,例如以ObjectDataSource连结中间层商业逻辑组件,那数据验证的动作就要往中间层商业逻辑组件中处理;因为以后若有其它的前端(如 WinForm、WebService)要连接这个商业逻辑组件,就无需再写一次数据验证动作了。

#6楼    回复  引用  查看    

2008-06-18 11:08 by 要有好的心情      
个人意见:
在 GridView.RowUpdating 处理 验证、格式化、数据变化等任务。
在 SqlDataSource的Updating事件中处理命令参数默认值、添加或变更命令参数。
当然,这两个地方都可以,不过我觉得还是要职责明确,从职责来说,GridView.RowUpdating更倾向于提供合法数据,而SqlDataSource.Updating更倾向于提供合理正确的参数值。

我觉得GridView.RowUpdating 在于提供要提交的数据,而
SqlDataSource.Updating在于根据用户录入的数据产生命令的参数值。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-13 19:33 编辑过


相关链接: