ASP.NET Web开发框架之七 开发流程与模式
2012-10-08 09:54
239 查看
经过前面六篇文章的讲解,基本的理论已经介绍完毕,这一篇进行实战练习,讨论如何从头开始开发一个完整的ASP.NET 页面,并进行数据读写,业务逻辑设定。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953207388.png)
如果表与表之前有关联,LLBL Gen会自动生成表之间的关联。
![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953284022.png)
请在项目的Source\Maintenance\Template路径下获取上面所提到的两个模板,用以生成数据读写接口与实现代码。
![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953374460.png)
FormRow会为它的Items平均分配宽度,所以每行FormRow最好放置相同的Items以让界面布局看起来美观整齐。
ASP.NET的后台代码看起来是这样的,这里罗列所有的代码,供您参考。
首先给页面分配一个功能编码,比如此页面的AIITHD,然后设定的Url属性,这两个同时附加到页面的特性中去。
[Function("AIITHD", "~/module/company.aspx")]
这里有些不足之处,到目前为止我还没有找到根据ASP.NET页面类型,得到它的页面文件。因为ASP.NET的请求处理是以ASPX文件在浏览器中敲入后,发送到服务器来执行的。所以,如果能找到这个办法,则这里的Url设定可以省略。
其次,指定TransactionType = EntityType.CompanyEntity,这用来指定当前页面的实体为CompanyEntity,并对它进行读写操作,与页面相关的数据绑定,回写到数据库中,均需要此属性。紧接着的是三个模板方法,LoadEntity用于加载公司实体,DeleteEntity用于删除,SaveEntity用于保存修改后的实体。这三个方法均是override,它被页面基类调用。
最后执行一下功能编码为AIITHD的功能,来看看效果是怎样的。在页面的右上角输入功能编码,点击Go按钮。
![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953456076.png)
关于数据绑定,所有的秘密藏在页面文件中,我以Company No为例子,请看它的页面文件
它的DataBindingString属性,在读取数据时,将实体属性绑定到此控件,在保存时,又读取这个值,回写到实体中并保存到数据库中,这样可以减少大量重复的代码。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
1 设计数据库表 Table Design
公司表存放系统中的公司实例,表示进行业务往来的实体,它的表结构如下脚本所示CREATE TABLE [dbo].[Company]( [CompID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, [ParentCompID] [numeric](18, 0) NULL, [CompTypeID] [numeric](18, 0) NOT NULL, [CompNO] [varchar](20) NOT NULL, [CompName] [varchar](50) NOT NULL, [Corporation] [varchar](20) NULL, [CorpMobile] [varchar](20) NULL, [CorpTel] [varchar](20) NULL, [Address] [varchar](100) NULL, [Tel1] [varchar](20) NULL, [Tel2] [varchar](20) NULL, [Fax] [varchar](20) NULL, CONSTRAINT [PK_TCOMPANY] PRIMARY KEY CLUSTERED ( [CompID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
2 实体映射 ORM Mapping
打开LLBL Gen,连接到数据库并更新实体,把上面的Company表映射到实体CompanyEntity。设计字段名时,最好以简明,可读性好的词命名,这样可以增强映射到实体上的属性的可读性。![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953207388.png)
如果表与表之前有关联,LLBL Gen会自动生成表之间的关联。
3 数据读写接口与实现的产生 Interface and Service Implementation
这一步骤也是自动化的,不需要额外的脑力活动。以Code Smith打开模板Interface.cst和Manager.cst,选择表对象为Company,生成代码,把这此代码拷贝到Visual Studio的项目中即可。![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953284022.png)
请在项目的Source\Maintenance\Template路径下获取上面所提到的两个模板,用以生成数据读写接口与实现代码。
4 ASP.NET 页面布局与编程 ASP.NET Page Layout Design and Coding
向Web项目中添加一个ASP.NET 页面,命名为company.aspx。我推荐以小写命名Web项目的文件夹,文件名和页面类型名称。为了让它具备EntryPageBase的功能,我在页面的首部,添加一个Toolbar,它用来承载工具箱中的系列工具,以进行数据的前后浏览,增加删除工作。其它的地方,以FormRow的方式安排布局。![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953374460.png)
FormRow会为它的Items平均分配宽度,所以每行FormRow最好放置相同的Items以让界面布局看起来美观整齐。
ASP.NET的后台代码看起来是这样的,这里罗列所有的代码,供您参考。
[Function("AIITHD", "~/module/company.aspx")] public partial class company : EntryPageBase { protected override void PageLoadEvent(object sender, EventArgs e) { if (!IsPostBack) { TransactionType = EntityType.CompanyEntity; ddlCompanyGroup.InitializeValueListFromEnum(9); } base.PageLoadEvent(sender, e); } public override EntityBase2 LoadEntity(string refNo) { ICompanyManager manager = ClientProxyFactory.CreateProxyInstance<ICompanyManager>(); CompanyEntity customer = manager.GetCompany(Convert.ToInt16(refNo)); return customer; } public override void DeleteEntity(EntityBase2 entity) { CompanyEntity user = (CompanyEntity)entity; ICompanyManager manager = ClientProxyFactory.CreateProxyInstance<ICompanyManager>(); manager.DeleteCompany(user); } public override void SaveEntity(EntityBase2 entity) { CompanyEntity user = (CompanyEntity)entity; ICompanyManager manager = ClientProxyFactory.CreateProxyInstance<ICompanyManager>(); manager.SaveCompany(user); } }
首先给页面分配一个功能编码,比如此页面的AIITHD,然后设定的Url属性,这两个同时附加到页面的特性中去。
[Function("AIITHD", "~/module/company.aspx")]
这里有些不足之处,到目前为止我还没有找到根据ASP.NET页面类型,得到它的页面文件。因为ASP.NET的请求处理是以ASPX文件在浏览器中敲入后,发送到服务器来执行的。所以,如果能找到这个办法,则这里的Url设定可以省略。
其次,指定TransactionType = EntityType.CompanyEntity,这用来指定当前页面的实体为CompanyEntity,并对它进行读写操作,与页面相关的数据绑定,回写到数据库中,均需要此属性。紧接着的是三个模板方法,LoadEntity用于加载公司实体,DeleteEntity用于删除,SaveEntity用于保存修改后的实体。这三个方法均是override,它被页面基类调用。
最后执行一下功能编码为AIITHD的功能,来看看效果是怎样的。在页面的右上角输入功能编码,点击Go按钮。
![](http://images.cnblogs.com/cnblogs_com/JamesLi2015/201210/201210080953456076.png)
关于数据绑定,所有的秘密藏在页面文件中,我以Company No为例子,请看它的页面文件
<ext:TextBox ID="tbxName" runat="server" Label="Company No" DataBindingString="CompanyEntity:CompNo"> </ext:TextBox>
它的DataBindingString属性,在读取数据时,将实体属性绑定到此控件,在保存时,又读取这个值,回写到实体中并保存到数据库中,这样可以减少大量重复的代码。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
相关文章推荐
- ASP.NET MVC 框架是 .NET 平台 Web 开发的主流,但是并不适合初学者
- 兼容Mono的下一代云环境Web开发框架ASP.NET vNext
- 【原创】ASP.NET Web 应用开发实战快速上手系列 1——配置环境及预备知识(框架、VS、C#)
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- 基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速Web开发框架设计
- ASP.NET Web开发框架之零 项目介绍
- 微软下一代云环境Web开发框架ASP.NET vNext预览
- ASP.NET Web开发框架之三 报表开发
- 微软下一代云环境Web开发框架ASP.NET vNext预览
- ASP.NET Web开发框架 查询
- ASP.NET Web开发框架之 数据库文档方法
- RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台
- ASP.NET Web开发框架之八 所有ERP部分的源代码全部开放下载
- ASP.NET Web开发框架之零 项目介绍
- ASP.NET Web开发框架之二 数据输入窗体
- ASP.NET Web开发框架之 查询
- ASP.NET vNext:微软下一代云环境Web开发框架
- ASP.NET Web开发框架之一 功能导航
- ASP.NET Web开发框架之二 数据输入窗体
- ASP.NET Web开发框架之四 查询