手机版

ASP.NET 2.0第38号运行数据:处理BLL和DAL异常

时间:2021-10-31 来源:互联网 编辑:宝哥软件园 浏览:

介绍

在数据列表中编辑和删除数据的概述中,我们创建了一个数据列表,提供简单的编辑和删除功能。虽然功能齐全,但对用户并不友好。因为在编辑和删除过程中生成的所有异常都是未经处理的。比如产品名称省略,或者“非常实惠!”在编辑产品时输入价格。将引发异常。因为这些异常没有被代码捕获,所以页面将显示ASP.NET运行时的详细错误信息。

从ASP.NET页面的BLL/DAL层异常处理中我们可以看到,如果BLL或DAL发生异常,详细信息将返回给ObjectDataSource,然后返回给GridView。我们已经学习了如何优雅地处理这些异常:为ObjectDataSource或GridView创建一个Updated或RowUpdated事件处理程序,检查异常,然后指示异常已被处理。

但是,在使用数据列表时,我们没有通过ObjectDataSource更新和删除数据。我们直接通过BLL做。为了检测BLL或DAL的异常,我们需要在ASP.NET页面中编写异常处理代码。在本章中,我们将学习如何在使用DataList进行编辑时巧妙地处理异常。

注意:在编辑和删除数据列表中的数据的概述中,我们讨论了几种不同的编辑和删除数据的方法,其中一些方法涉及使用ObjectDataSource来编辑和删除数据。如果使用这些技术,可以通过ObjectDataSource的“已更新”或“已删除”事件处理直接处理这些异常。

第一步:是创建一个可编辑的数据列表。

首先,创建一个可编辑的数据列表。打开编辑删除数据列表文件夹下的错误处理. aspx页面,添加一个带有产品标识和名为产品数据源的对象数据列表。在SELECT选项卡下,选择ProductsBLL类的GetProducts()方法。在“插入”、“更新”和“删除”选项卡中选择“无”。

//files.jb51.net/file_images/article/201605/2016051210312023.png

图1:配置对象数据源。

在完成ObjectDataSouce后,Visual Studio将自动创建一个ItemTemplate。使用显示每个产品的名称和价格并包含“编辑”按钮的项目模板,然后创建一个在文本框中显示名称和价格并包含“更新”按钮和“取消”按钮的编辑项目模板。最后,将DataList的RepeatColumns属性设置为2。

之后,您的声明代码应该类似于下面的代码。检查“编辑”、“取消”和“更新”按钮的命令名称属性是否分别设置为“编辑”、“取消”和“更新”。

asp3360目录ID=' Products ' runat=' server ' DataKeyField=' Product ID ' DataSourceID=' Products data source ' repeat columns=' 2 ' item template H5 asp: label l runat=' server ' ID=' Product name label ' Text=' % # Eval(' Product name ' % ')'//H5 price : asp: label runat=' server ' ID=' label 1 ' Text=' % # Eval(' unit price ',' {0 { 0: c } ')% '/br/br/ASP : button ID=' UpdateProduct ' runat=' server ' command name=' Update ' Text=' Update '/ASP : button ID=' Cancel date ' runat=' server ' command name=' Cancel ' Text=' Cancel '/edititemtample/ASP 3360 catalistasp 3360 object data source ID=' products data source ' runat=' server ' SelectMethod=' GetProducts ' type name=' products ' 浏览页面,如图2所示。

//files.jb51.net/file_images/article/201605/2016051210312024.png

图2:每个产品包含一个编辑按钮。

现在编辑按钮只是引起一个回发—还不能将产品变成可编辑的。为了实现编辑功能,我们需要为编辑命令,取消命令和更新命令创建事件处理编辑命令和取消命令事件仅仅只需要更新数据列表的编辑项目索引属性,并重新绑定数据到数据列表。

受保护的void Products_EditCommand(对象源,datalistcommanventargs(e){//将数据列表的编辑项目索引属性设置为单击产品的数据列表项的//索引。编辑项目索引=项目。ItemIndex//将数据重新绑定到数据列表产品. DataBind();}受保护的void Products_CancelCommand(对象源,DataList command ventargs(e){//将数据列表的编辑项目索引属性设置为-1产品.edititeindex=-1;//将数据重新绑定到数据列表产品. DataBind();}更新命令事件处理稍微麻烦一点。它需要从数据键集合里读取被编辑的产品的ProductID,和编辑模板里的文本框里的产品的名字和价格,然后调用ProductsBLL类的更新产品方法,最后返回到数据列表编辑前的状态。

我们在这里使用在数据列表里编辑和删除数据概述里的更新命令事件处理代码。

受保护的void Products_UpdateCommand(对象源,datalistcommanventargs(e){//从数据键集合中读入产品int productID=Convert .ToInt32(产品数据键[项目。项目索引]);//读入产品名称和价格值文本框产品名称=(文本框)e .项目。查找控件(' ProductName ');文本框单价=(文本框)e.Item.FindControl('单价');字符串ProductNameValue=null if(ProductName .文本。修剪()。长度0) productNameValue=productName .文字。trim();十进制?unitPriceValue=nullif(单价。文本。修剪()。长度0)单价值=十进制。解析(单价。文本。修剪(),系统。全球化。数字风格。货币);//调用ProductsBLL的更新产品方法.产品bll产品API=新产品bll();产品应用编程接口.UpdateProduct(productNameValue,unitPriceValue,ProductID);//将数据列表恢复到编辑前的状态产品edititeindex=-1;产品. DataBind();}在有非法输入的时候— 可能是不正确的价格格式,比如"-$5.00",或者忽略了产品的名字——就会引起异常。由于更新命令事件处理还没有处理异常,页面会出现ASP .网运行时错误。见图3。

//files.jb51.net/file_images/article/201605/2016051210312025.png

图3: 未处理异常发生时,用户会看到这样的错误页面

第二步: 在更新命令事件处理程序里处理异常

更新流程中,异常可能发生在更新命令事件处理,或基地址定位连接或木豆里。比如,如果用户输入了一个"太贵"的价格,更新命令事件处理里的小数。从语法上分析会抛出格式异常异常。如果用户忽略了产品的名字或者价格是一个负数,DAL会抛出异常。

当异常发生时,我们希望显示自己定义的信息。添加一个身份为例外详细信息的标签控件到页面上,通过设置设置一下属性为警告半铸钢钢性铸铁(Cast Semi-Steel)类来将文本设置为红色,特大,加粗的意大利字体。这个类在Styles.css文件里定义。

异常发生时,我们只希望这个标签显示一次。也就是说,在后面回发的时候,标签的警告信息需要隐藏起来。这个可以通过清除标签的文本属性或者将看得见的属性设为假(在页面加载里)(如我们在在ASP .网页面中处理BLL/大连层的异常里做的那样)或者禁用标签的查看状态来实现。我们这里用后一种方法。

asp:Label标签标签ID=' exceptiontails ' EnableViewState=' False ' CSS类=' Warning ' runat=' server '/异常发生时,我们将异常的信息显示在标签的文本属性上。由于查看状态被禁用了,后面再回发的话,文本属性会自动的丢失,回到缺省值(空字符串),这样就隐藏了警告信息。

出现异常时,信息将显示在页面上。我们需要添加一个尝试.更新命令事件处理中的Catch块。Try部分包含可能引发异常的代码,Catch部分包含发生异常时需要执行的代码。有关更多尝试,请参见异常处理基础.捕捉信息块。

受保护的void Products_UpdateCommand(对象源,datalistcommandventargs e){ //处理编辑过程中引发的任何异常尝试{//从DataKeys集合中读入ProductID int ProductID=Convert。ToInt32(产品。DataKeys[e . item . item index]);为了简洁,省略了一些代码.} catch(Exception ex){//todo :在ExceptionDetails中显示有关异常的信息}}

无论在Try块中抛出什么类型的异常,都会执行Catch块的代码。引发的异常类型-dbexception、nonullallowedexception、argumentexception等。-取决于第一个错误。如果是数据库级别的问题,将引发DbException。如果单价、库存单位、unitsonorder或ReorderLevel字段具有非法值,将引发ArgumentException(我们添加了代码来验证ProductsDataTable中的字段值,请参见创建业务逻辑层)。

我们可以根据捕获的异常类型为用户提供更好的帮助。下面的代码提供了这一功能,它与ASP.NET页面中的BLL/DAL层中的异常处理基本相同:

private void displayExceptionDetails(Exception ex){//显示用户友好的消息exceptiontails。文本=“更新产品时出现问题。”;如果(例如是系统。数据。公共。数据库异常)异常详细信息。文本='我们的数据库当前遇到问题。请稍后再试。else if (ex为NoNullAllowedException)ExceptionDetails。Text=“缺少一个或多个必填字段。”;else if (ex是ArgumentException){ string param name=((ArgumentException)ex)。ParamName例外详细信息。Text=字符串。Concat('The ',' paramName,'值非法。);} else if (ex是application exception)exception endeats。Text=ex。消息;}最后,您只需要调用DisplayExceptionDetails方法。

试了试之后.Catch,用户将看到更多有用的错误消息,如图4和5所示。请注意,当发生异常时,数据列表仍处于可编辑模式。这是因为当异常发生时,控制流会立即转向Catch块,忽略将DataList转换为预编辑状态的代码。

//files.jb51.net/file_images/article/201605/2016051210312026.png

图4:用户忽略必填字段时的错误消息。

//files.jb51.net/file_images/article/201605/2016051210312027.png

图5:输入非法价格时的错误信息。

摘要

GridView和ObjectDataSource提供事件处理,包括更新和删除过程中的异常信息,以及指示是否处理异常的属性。但是,直接使用BLL的DataList没有这些特性,所以我们需要自己处理这些异常。

在本章中,我们学习了如何添加“尝试”.在更新数据列表的过程中捕获UpdateCommand块以处理异常。如果发生任何异常,将执行Catch块中的代码,并且错误消息将显示在ExceptionDetails标签上。

现在,DataList并没有在第一时间阻止异常的发生。虽然我们知道一个负的价格值会产生异常,但是我们并没有增加阻止用户输入这样一个值的功能。在接下来的章节中,我们将学习如何通过在EditItemTemplate中添加验证控件来验证用户的输入,从而减少这些异常的发生。

编程快乐!

作者简介

Scott Mitchell,本系列教程的作者,也是关于ASP/ASP的六本书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。你可以点击查看所有教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望能帮助你学习ASP.NET。

版权声明:ASP.NET 2.0第38号运行数据:处理BLL和DAL异常是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。