五十三在DataWeb控件显示二进制数据

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

在ASP.NET2.0中操作数据之五十三:在DataWeb控件显示二进制数据作者:heker2007字体:[增加减小]类型:转载时间:2016-05-17我要评论本文主要介绍在ASP.NET2.0中直接显示PDF超链接的方法,以及如何把已二进制数据形式保存的图片显示在GridView中的方法,虽然这种方法在实际开发中很少用,但还是值得学习一下。导言:在前面的教程我们阐述了应用程序处理二进制数据的2种模式,以及使用FileUpload控件从浏览器向服务器文件系统上传文件。当文件上传并存储在文件系统里时,应在相应的数据库记录里存储该文件的存储路径。我们先来看如何为最终用户提供二进制数据。怎样展示二进制数据呢?这取决于其类型。比如图片,我们将其显示为image;如果是PDFs,MicrosoftWord文档、ZIP文件或其它类型的数据,或许提供一个“Download”链接比较妥当。在本节,我们看如何在GridView和DetailsView一类的数据Web控件里呈现二进制数据,在后面的教程我们将注意力转向将上传文件和数据库联系起来。第一步:提供BrochurePath值表Categories的Picture列存储相关类的图片信息。具体的讲,为16色的低质量位图,大小为172乘120像素,约11KB。另外还包括一个约78字节的OLE报头,在显示图片的时候需要将其剥离。为什么会有报头信息呢?因为数据库Northwind源于微软的Access数据库。在Access里二进制数据OLE类型来存储的,该类型会添加报头。现在,我们看如何从图片剥离报头,以便显示。在后面的教程我们将创建一个界面,将带报头的这些位图替换为不带报头的等价的JPG图片。前面我们考察了如何使用FileUpload控件,让我们继续为服务器文件系统添加文件。不过暂时不用更新Categories表的BrochurePath列,那是下一章的内容。我们现在需要手工为BrochurePath赋值。在本教程,当你下载东西时,可以看到在~/Brochures7文件夹有7个PDF小册子,每个小册子对应一个种类,Seafood除外。我故意没为Seafood提供PDF小册子,以便探讨如何处理某些记录没有附带二进制数据的情况。在服务器资源管理器里右键点击Categories,选“查看表数据”,输入文件路径,如图1所示。由于Seafood类没有图片,将其BrochurePath的值设为“NULL”。图1:手工为表Categories的BrochurePath列键入值第2步:在GridView里添加一个下载链接当为表Categories的BrochurePath列赋值后,我们准备创建一个GridView用于展示每个种类,并附带一个链接下载每个类的小册子。在第4步我们将扩展GridView以显示每个类的图片。打开BinaryData文件夹的DisplayOrDownloadData.aspx页面并进入设计模式,从工具箱里拖一个GridView控件到页面,设其ID为Categories,从其智能标签选择绑定到一个名为CategoriesDataSource的ObjectDataSource控件。该控件调用类CategoriesBLL的GetCategories()方法。图2:创建一个名为CategoriesDataSource的ObjectDataSource控件图3:设置ObjectDataSource使用CategoriesBLL类图4:调用GetCategories()方法完成设置后,VisualStudio自动的为CategoryID,CategoryName,Description,NumberOfProducts和BrochurePath生成BoundField。移除NumberOfProducts,因为GetCategories()方法用不上,同样将CategoryID移除了。分别把CategoryName和BrochurePath的HeaderText属性改为“Category”和“Brochure”。做上述修改后,你的GridViewandObjectDataSource的声明代码看起来应该像下面的这样:?12345678910asp:GridViewID=Categoriesrunat=serverAutoGenerateColumns=FalseDataKeyNames=CategoryIDDataSourceID=CategoriesDataSourceEnableViewState=FalseColumnsasp:BoundFieldDataField=CategoryNameHeaderText=CategorySortExpression=CategoryName/asp:BoundFieldDataField=DescriptionHeaderText=DescriptionSortExpression=Description/asp:BoundFieldDataField=BrochurePathHeaderText=BrochureSortExpression=BrochurePath//Columns/asp:GridViewasp:ObjectDataSourceID=CategoriesDataSourcerunat=serverOldValuesParameterFormatString=original_{0}11121314151617SelectMethod=GetCategoriesTypeName=CategoriesBLL/asp:ObjectDataSource在浏览器查看该页(如图5)。列出了所有的8个类,除了Seafood,其它7个类的BoundField列里显示各自的BrochurePath值。由于Seafood的BrochurePath为NULL值,看起来为空格。图5:显示了每个类别的Name,Description和BrochurePath值与其显示BrochurePath的text值,不如创建一个指向小册子的链接。移除BrochurePath,代之以HyperLinkField。设它的HeaderText属性为“Brochure”,Text属性为“ViewBrochure”,DataNavigateUrlFields属性为“BrochurePath”。图6:添加一个指向BrochurePath的HyperLinkField这样将在GridView里添加一列链接,如图7所示。点“ViewBrochure”时要么直接在浏览器显示PDF,要么提示用户下载该文件。这取决于浏览器的设置以及是否安装了PDF阅读器。图7:点击“ViewBrochure”访问某类的Brochure图8:显示某类的PDF文件隐藏无小册子图片的类的“ViewBrochure”文本如图7所示,不管某个类的BrochurePath是否为NULL值,名为BrochurePath的HyperLinkField都呈现为其Text属性(“ViewBrochure”)。当然,如果BrochurePath为NULL值,链接只显示为文本(而不带下划线),就像Seafood类一样(见图7)。与显示文本“ViewBrochure”相比,更为可取的是将那些BrochurePath值为空的类显示为“NoBrochureAvailable”。为达此目的,我们需要用到TemplateField,使其产生一个基于BrochurePath值的合适的结果。我们先来看看如何实现,就像在教程之12《在GridView控件中使用TemplateField》一样。在“编辑列”对话框里选中名为BrochurePath的HyperLinkField,再点“ConvertthisfieldintoaTemplateField”链接,将其转换为TemplateField。图9:将HyperLinkField转换为TemplateField这样将创建一个TemplateField,其ItemTemplate模板包含一个HyperLinkWeb控件,该控件的NavigateUrl属性为BrochurePath值。用下面的代码将其替换掉:?12345asp:TemplateFieldHeaderText=BrochureItemTemplate%#GenerateBrochureLink(Eval(BrochurePath))%/ItemTemplate/asp:TemplateField然后,在ASP.NET页面的“后台代码”里添加一个protected类型的GenerateBrochureLink方法,它接受一个输入参数并返回一个字符串。?123protectedstringGenerateBrochureLink(objectBrochurePath){if(Convert.IsDBNull(BrochurePath))returnNoBrochureAvailable;else45678returnstring.Format(@ahref={0}ViewBrochure/a,ResolveUrl(BrochurePath.ToString()));}该方法判断传入的值是否为NULL。如果是,则返回一个消息指出该类没有小册子文件;相反,如果传入值不为空,将显示为一个链接。我们注意到,当BrochurePath值不为空时,将调用ResolveUrl(url)方法。该方法的作用在于将传入的相对路径转换为物理路径。比如应用程序的根目录在/Tutorial55,ResolveUrl(~/Brochures/Meats.pdf)返回的路径是/Tutorial55/Brochures/Meat.pdf.图10为经过上述修改后的界面。我们注意到Seafood类的BrochurePath列现在显示为文本“NoBrochureAvailable”.图10:没有小册子的类将显示为文本“NoBrochureAvailable”第3步:新增页面以显示类的图片当用户访问一个ASP.NET页面时,他将接收该页面的HTML代码。HTML代码仅仅包含了text文本,而并不包含任何的二进制数据。任何的二进制数据,比如图片,音乐文件、Flash程序、WindowsMediaPlayer视频等,以独立资源的形式存放于服务器。HTML只包含了这些文件的引用,并不包含这些文件本身。比如,在HTML里img元素用来引用一张图片,其src属性指向该图片文件,如:imgsrc=MyPicture.jpg.../当浏览器收到HTML代码时,它向服务器发送获取图片的请求并将其显示在浏览器中,该模式对所有的二进制数据都适用。在第2步中,我们没有在页面的HTML标记里将小册子显示在浏览器,而是在HTML标记里提供一个超链接,当点击它是,导致浏览器直接请求PDF文件。为了显示或允许用户下载储存在数据库中的二进制数据,我们需要另外创建一个页面,用于从数据库返回所需的数据。对我们的应用程序而言,由于直接存储在数据库中的二进制数据只有一项——类的图片,所以我们需要一个页面,当需要时从数据库返回某个特定类的图片。在BinaryData文件夹添加一个DisplayCategoryPicture.aspx页面,注意不要使用母版页。该页面接受一个包含CategoryID值的查询字符串,返回Picture列的二进制数据。由于该页只返回二进制数据,所以我们不需要页面的HTML部分有任何代码。进入页面的“源码”模式,删除页面的所有代码,只保留%@Page%部分。也即:DisplayCategoryPicture.aspx页面的声明代码应该只由如下的单独行构成:?123%@PageLanguage=C#AutoEventWireup=trueCodeFile=DisplayCategoryPicture.a

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功