ASP.NET多语种网络硬盘系统的设计

发布于:2024-04-19 ⋅ 阅读:(35) ⋅ 点赞:(0)

摘 要

网络硬盘系统是计算机网络中比较流行的一种应用软件,但是一般的网络硬盘系统只适用于使用单一语种的人群。为满足不同语种人群对网络硬盘系统的需求,设计了多语种网络硬盘系统。采用ASP.NET 2.0开发语言,利用ASP.NET中的三层结构、B/S模式结构以及ASP.NET网页资源的设计思路,实现了包括文件夹的操作、文件的操作、网页的多语种化三个功能模块;通过文件夹功能模块,可以添加、删除、更改名字、移动、浏览文件夹;通过文件功能模块,可以查看文件属性、上传、下载、更改名字、移动文件;通过系统的多语种化模块,能够自动识别客户端的默认语言并反馈给客户端相应语言的网页。通过应用多语种网络硬盘系统,可以满足不同语种人群共享一个网络硬盘系统的需求,具有一定的应用价值。

关键词:计算机应用技术;网络编程;ASP.NET 2.0;资源本地化;自动识别

1. ASP.NET 2.0简介

ASP.NET 2.0是目前比较新的版本,具有一些程序员可以使用的特定的服务器控件,用于在页面上添加数据交互。这些专门的数据控件分为两组:数据源控件和数据绑定控件。数据源控件创建与数据库的链接。数据绑定控件则从数据源控件获取信息,并在页面上创建呈现。这种简单的双控件模式可用于多种情况。对于多种数据库类型,甚至是非关系型数据源,都有相应的数据源控件。同样地,有多种数据绑定控件可用来在页面上生成表格、树型、列表以及其他数据格式。

2. ASP.NET中的三层结构

用三层结构主要是使项目结构更清楚,分工更明确,有利于后期的维护和升级.

三层结构包含:表示层(USL),业务逻辑层(BLL),数据访问层(DAL)

1:数据库访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务.

2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成 .aspx, 如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。

3. B/S模式结构简介

B/S结构(Browser/Server结构)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。它的客户端就是浏览器,当系统需要升级,就不需要为每个现有的客户端应用程序升级,而只需对服务器上的服务处理程序进行修改。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。B/S架构管理软件更是方便、快捷、高效。

4. ASP.NET 网页资源概述 

ASP.NET 为我们提供了一种方法,使用这种方法创建的页可以根据浏览器的首选语言设置或用户显式选择的语言获取内容和其他数据。内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。

在 ASP.NET 网页中,可以将控件配置为从资源获取其属性值。在运行时,资源表达式将被相应资源文件中的资源替换。

5. 数据库设计

数据库的名称为WebDiskDB,版本为SQL Server 2000。该数据库中有文件目录表Directory和文件属性表Url。

在文件目录表Directory中:

  1. DirID字段存储ID;
  2. Name字段存储文件夹或文件的名称;
  3. ParentID字段存储文件夹或文件父目录的ID;
  4. Contain字段存储文件夹或文件大小;
  5. FileCount字段存储包含文件的数量;
  6. DirCount字段存储包含文件夹的数量;
  7. Flag字段存储是文件还是文件夹的标识;
  8. CreateDate字段存储文件夹或文件的创建时间

表1  文件目录表

字段名

数据类型

字段说明

备    注

DirID

int

ID

主键(自动增一)

Name

varchat(50)

名称

ParentID

int

父目录ID

Contain

int

大小

FileCount

Int

包含文件的数量

DirCount

Int

包含文件夹的数量

Flag

bit

文件标识

1:文件夹;2:文件

CreateDate

datetime

创建时间

在文件属性表Url中:

    1. UrlID字段存储ID;
    2. Url字段存储文件的链接地址;
    3. Type字段存储文件的类型;
    4. DirID字段存储文件在文件目录表中的DirID值;
    5. CreateDate字段存储文件的创建时间;

表2  文件属性表

字段名

数据类型

字段说明

备    注

UrlID

int

ID

主键(自动增一)

Url

varchar(255)

链接地址

Type

varchar(200)

文件的类型

DirID

int

外键

CreateDate

datetime

创建时间

错误处理页面ErrorPage.aspx处理整个应用系统的错误信息。当应用程序发生错误时,跳转到该页面,并在该页面显示错误信息。

该页面设计比较简单。当页面初始化时,首先又函数Page_Load(object sender, EventArgs e)获取发生错误页面的地址,并把该地址保存在ViewState对象中,供页面上返回按钮相对应的事件BackBtn_Click(object sender,System.EventArgs e)使用。

7. 数据库操作层设计

数据库操作层是直接与数据库打交到,它的上一层不需要了解这一层内部的详细结构,我们就把它用一个类Disk给封装起来,给它的上一层提供一个接口IDisk就行了。

8. 多语言化实现的设计

在创建资源文件时,首先开始创建基文件 .resx。对于要支持的每种语言,分别创建一个新文件,该文件具有同一基本文件名但包含语言或语言及区域性(区域性名称)。

在运行时,ASP.NET 使用与 CurrentUICulture 属性的设置最为匹配的资源文件。线程的 UI 区域性根据页的 UI 区域性进行设置。例如,如果当前的 UI 区域性是西班牙语,则 ASP.NET 使用.es.resx 文件的已编译版本。如果当前的 UI 区域性没有匹配项,则 ASP.NET 会使用资源后备;首先用特定区域性的资源,接着用非特定区域性,最后用默认资源文件。

在 ASP.NET 中,可以创建具有不同范围的资源文件。可以创建全局资源文件,这意味着可以从位于网站中的任意页或代码读取这些资源文件。也可以创建本地资源文件,这些文件存储单个 ASP.NET 网页(.aspx 文件)的资源。将资源文件放入应用程序根目录的保留文件夹 App_GlobalResources 中,即可创建全局资源文件。App_GlobalResources 文件夹中的任何 .resx 文件都具有全局范围。此外,ASP.NET 还生成了一个强类型对象,这为开发人员提供了一种以编程方式访问全局资源的简单方法。本地资源文件是只应用于一个 ASP.NET 页的文件(带有 .aspx、.ascx、.master 等扩展名的 ASP.NET 页)。本地资源文件所放入的文件夹具有 App_LocalResources 保留名称。App_LocalResources 文件夹可以存在于应用程序的任何文件夹中,这与 App_GlobalResources 根文件夹不同。通过资源文件名将一组资源文件与特定的网页相关联。文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名 .resx 结尾。

9. 主要用户界面层的实现

用户界面层直接面向用户,它使用数据库操作层的方法来获取数据,这样开发难度就大大的降低了。

9.1  主页的实现

浏览网络硬盘由ShowDisk.aspx.cs实现。页面初始化时,要实现下面三个功能:

  1. 获取参数DirID和ParentID的值
  2. 显示DirList控件的目录信息。
  3. 显示当前目录下的硬盘信息。如果参数DirID大于-1,则显示DirID目录下的信息;如果ParentID大于-1,则显示ParentID目录下的信息;否则显示跟目录下的信息。上述功能由函数Page_Load(object sender, EventArgs e)实现。

函数BindDirectoryData()显示控件DirList的目录信息,这些功能都是由函数ShowDirectory(DropDownList dirList,int nParentID)实现。函数BindDirectoryData()的程序代码如下:

    private void BindDirectoryData()

    {   ///显示目录列表信息

       Disk disk = new Disk();

       disk.ShowDirectory(DirList,-1);

       if(DirList.Items.Count > 0)

       {

           DirList.SelectedIndex = 0;

       }

       disk.ShowDirectory(MoveDirList,-1); }

函数BindDirectoryData(int nParentID)首先根据参数nParentID从数据库中获取ID值为nParentID的目录和文件,然后使用DiskView控件显示文件夹和文件等信息,并设置【返回上级目录】按钮的可用性。函数BindDirectoryData(int nParentID)的程序代码如下:

    private void BindDirectoryData(int nParentID)

    {

       ///显示目录列表信息

       IDisk disk = new Disk();

       SqlDataReader dr = disk.GetDirectoryFile(nParentID);

       ///绑定控件的数据

       DiskView.DataSource = dr;

       DiskView.DataBind();

       dr.Close();

       ReturnBtn.Visible = nParentID > 0 ? true : false;

    }

页面在显示目录、文件的标志时,使用函数FormatImageUrl(bool bFlag,string sType)获取图象的链接地址。该函数根据目录或者文件的类型获取不同图象的链接地址。

页面在显示目录、文件时,需要使用不同的链接地址。因此,页面使用函数格式化链接地址,由函数FormatHerf(int nDirID,int nParentID,bool bFlag)实现,该函数根据参数bFlag返回不同的链接地址。它的程序代码如下:

    protected string FormatHerf(int nDirID,int nParentID,bool bFlag)

    {  if(bFlag == true)

       {

           return ("ShowDisk.aspx?DirID=" + nDirID.ToString() + "&ParentID=" + nParentID.ToString());}

       else

       {

           return ("ViewDisk.aspx?DirID=" + nDirID.ToString() + "&ParentID=" + nParentID.ToString());}

    }

改变DirList控件的选择时,需要重新绑定DiskView控件的数据。该功能由DirList控件的事件DirList_SelectedIndexChanged(object sender,EventArgs e)实现。它的程序代码如下:

    protected void DirList_SelectedIndexChanged(object sender,EventArgs e)

    {   ///绑定控件的数据

       BindDirectoryData(Int32.Parse(DirList.SelectedValue));}

图4 硬盘主页

9.2  文件上传页面的实现

上载文件和同时上载多个文件的功能都由页面UploadFile.aspx实现。它的代码文件为UploadFile.aspx.cs。函数UploadFiles(int nParentID)实现上载文件的方法如下:

    1. 从HttpContext的当前上下文的Request对象中获取所有文件,并用列表fileList保存。
    2. 获取fileList中每一个文件,表示为hPostedFile。
    3. 获取文件的名称并把它保存在硬盘上。
    4. 从已经上传的文件信息保存到数据库中。
    5. 在页面上显示已经上传的文件信息。

图5 添加文件页面

9.3  文件属性页面的实现

查看文件属性由ViewDisk.aspx实现。ViewDisk.aspx在初始化时,首先从地址栏中获取参数nDirID和参数nParentID的值,然后显示文件的属性。

函数BindFileData(int nDirID)根据参数nDirID从数据库获取文件的属性

由于文件所在目录没有在数据库中直接保存,因此需要动态创建。该功能由函数CreateDir(int nDirID)和函数InsertParentDir(DataTable dataTable,int

nParentID,StringBuilder sDir)实现。创建文件所在目录的具体方法如下:

    1. 定义保存目录的字符串dirSB;
    2. 从数据库中获取所有目录,并使用DataTable对象dataTable保存获取的结果;
    3. 获取当前文件的父目录的DirID,并根据此DirID值获取它的名称,并把该名称添加到字符串dirSB中;
    4. 获取步骤(3)文件的父目录,并重复步骤(3),直到ParentID的值为-1。

其中,步骤(1)和步骤(2)由函数CreateDir(int nDirID)实现,步骤(3)和步骤(4)由函数InsertParentDir(DataTable dataTable,int

nParentID,StringBuilder sDir)实现。

图6  查看文件属性页面

9.4  搜索文件页面的实现

搜索文件功能由SearchFile.aspx实现,它的代码隐藏文件为SearchFile.aspx.cs。

搜索功能是由SearchBtn_Click(object sender,EventArgs e)实现,具体代码如下:

    protected void SearchBtn_Click(object sender,EventArgs e)

    {

       ///定义对象

       IDisk disk = new Disk();

       ///执行数据库操作

       SqlDataReader dr = disk.SearchFiles(Name.Text.Trim());     

       FileView.DataSource = dr;

       FileView.DataBind();

       dr.Close();

   }

图7  搜索页面

9.5  创建文件夹页面的实现

创建文件夹功能由页面AddFolder.aspx实现,它的隐藏代码文件为AddFolder.aspx.cs。

该功能由事件AddBtn_Click(object sender,EventArgs e)实现,它调用AddDirectory(string sName,int nParentID)添加新文件夹到数据库中。它的具体代码如下:

    protected void AddBtn_Click(object sender,EventArgs e)

    {

       try

       {   ///定义对象

           IDisk disk = new Disk();

           ///执行数据库操作

disk.AddDirectory(Name.Text.Trim(),Int32.Parse(DirList.SelectedValue));

           Response.Write("<script>alert('" + "添加数据成功,请妥善保管好你的数据!" + "');</script>");

       }

       catch(Exception ex)

       {   ///跳转到异常错误处理页面

           Response.Redirect("ErrorPage.aspx?ErrorMsg=" + ex.Message.Replace("<br>","").Replace("\n","")

              + "&ErrorUrl=" + Request.Url.ToString().Replace("<br>","").Replace("\n",""));

       }

   }

9.6  重命名文件夹页面的实现

重命名文件夹功能由页面EditFolder.aspx实现,它的代码隐藏文件为EditFolder.aspx.cs

重命名功能的实现由事件EditBtn_Click(object sender,EventArgs e)实现,它调用函数EditDirectory(int nDirID,string sName)修改DirID值为nDirID的文件记录名称。它的具体代码如下:

    protected void EditBtn_Click(object sender,EventArgs e)

    {   try

       {   ///定义对象

           IDisk disk = new Disk();

           ///执行数据库操作

           disk.EditDirectory(nDirID,Name.Text.Trim());

           Response.Write("<script>alert('" + "修改数据成功,请妥善保管好你的数据!" + "');</script>");  }

       catch(Exception ex)

       {   ///跳转到异常错误处理页面

           Response.Redirect("ErrorPage.aspx?ErrorMsg=" + ex.Message.Replace("<br>","").Replace("\n","")

              + "&ErrorUrl=" + Request.Url.ToString().Replace("<br>","").Replace("\n",""));

       } }

10. 多语言关键技术实现

10.1  母板页

母板页是ASP.NET 2.0中新增的功能,使用母板页可以为WEB应用程序中的页创建一致的布局。单个母板页可以为WEB应用程序中的所有页定义所需的外观何标准行为。然后可以创建包含要显示的内容的各个内容页。当用户请求内容页时,这些内容页与母板页合并以将母板页的布局与内容页的内容组合在一起输出。

10.2  资源本地化

系统是以资源文件来实现系统的多语种化。资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。

为每种语言(如英语和法语)或每种语言和区域性(如英语 [英国]、英语 [美国])分别创建一个资源文件。每个本地化资源文件都有相同的键/值对;本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。

ASP.NET 中的资源文件具有 .resx 扩展名。在运行时,.resx 文件将编译进一个程序集内,该程序集有时称为附属程序集。由于 .resx 文件是用与 ASP.NET 网页相同的方式动态编译的,因此不必创建资源程序集。编译过程将多个语言类似的资源文件压缩在同一程序集内。