【IT168 技术】ASP.NET 自推出从1.0发展到4.0以来,在每个版本都有很重要和实用的功能推出,比如在1.0到2.0时代,使用了web控件的方式大大方便了开发者的开发,而在3.5中,又出现了很多新的功能,比如Heal Monitoring健康检查等。在4.0版本中,借鉴了开源阵营众多MVC框架思想,提供了ASP.NET MVC的框架,让Web开发者更得心应手的开发。
但程序员发现,在开发象数据模型驱动一类的应用时,需要编写不少代码,有时会很复杂,借助最新发布的ADO.NET Entity Framework框架,用户可以在对象模型转化为数据库对象这一步骤中减少一定的步骤和代码量。但随着ASP.NET 4.5的发布(目前是preview版本),在数据模型绑定这一方式上,又将有重大的变革。本文将以简单的例子讲解在asp.net 4.5中这一新特性的应用。本文的阅读对象建议为对ASP.NET 4.0有使用经验的读者。
ASP.NET 4.5中模型绑定
在A SP.NET 4.5中,我们可以直接将数据模型层中的模型直接跟相关的数据绑定控件和CRUD(增删改查操作)、分页操作进行绑定,但它跟ObjectDataSource控件和ASP.NET MVC中的模型绑定是有所不同的。要注意的是,asp.net 4.5 是基于.NET 4.5的,读者可以安装Visual Studio 2011 preview版本
(http://www.microsoft.com/download/en/details.aspx?id=27538可以下载)。如果要对ASP.NET 4.5的新特性有全面了解,可以参考如下的这篇文章(http://www.asp.net/vnext/whats-new)。
首先,我们来看ASP.NET 4.5中的新特性“Web表单的模型绑定”。在之前的版本中,web表单中的数据绑定,用的都是“Eval”的方法。在运行时期间,通过调用Eval方法,利用反射的原理去处理当前要绑定的数据对象,并读取其中Eval方法中指定名称的成员的值。关于为什么Eval方法的这种绑定形式是有害处的,可以参考如下这篇文章
(http://www.devcurry.com:80/2011/02/how-to-avoid-databindereval-in-aspnet.html)。
而在ASP.NET 4.5中,模型绑定的方式有了相当大的改进,我们通过下面的若干个步骤,来了解新的模型绑定方式有很什么不同:
- Web表单的模型绑定
- 过滤方式
- 更新操作
在本文中,我们使用的是Sql server 2008 R2版本,使用了其中的”Company”示例数据库作示范,其中有两个如下的表:
Department表 - DeptNo (int) Primary Key, Dname (varchar(50)),Location (varchar(50)).
Employee表 - EmpNo (int) Primary Key, EmpName (varchar(50)),Salary (int), DeptNo(int) Forwign Key.
下面我们正式开始实做的步骤:
1) 打开Visual Studio 2011 preview版本,新创建一个web应用工程,将其命名为“ASPNET45_ModelBinding”。
2) 在工程中,分别新增两个文件夹,一个名为Model,一个名为Department。在Department文件夹中,新增加两个web页面(注意都勾选上带master page功能),分别命名为
Deparment.aspx和Departmentdetail.aspx。
3) 在Model文件夹中,新增加一个ADO.NET实体对象模型,将其命名为CompanyEDMX.edmx。在其增加的向导中,注意选择Company数据库并选择Department和Employee表。在创建完毕后,如下图所示:
4) 在代码视图中,打开Department.aspx页面,增加一个Repeater控件,将其与Department数据模型进行绑定。 代码如下:
▲
在上面的代码中,请留意跟以往版本的ASP.NET 的不同,其中,在repeater控件中,使用了ModelType属性,指定了要将Deparment数据模型实体跟repeater控件进行绑定。ModelType属性在所有的数据绑定控件中,都是可以使用的。这个新特性可以允许我们去定义那些绑定在控件中的数据类型和能让我们在控件中绑定模型的属性。可以看到,我们现在可以不用象以前那样,写复杂的DataBinder.eval,而是直接通过
就可以直接输出数据模型Department中的属性了。
5) 打开Deparment.aspx.cs的代码界面,编写如下代码:
▲
可以看到,这里实际上直接将Department数据实体模型中的数据加载并跟repeater控件进行了绑定。其中objContext为通过ASP.NET 4.5的Entity Framework框架,自动将数据库中的数据实体内容进行了绑定,再通过objContext.Departments获得了数据库中Departments中的数据,最后记得跟控件绑定时,要使用ToList方法进行转换,转换为List类型的数据。
6) 直接运行程序,可以在浏览器中,看到如下图的界面,列出了所有的部门。
7) 在上面的步骤中,我们其中需要点每个部门的连接,显示该部门下的详细情况。这个在asp.net 2.0到4.0时代,我们常用的方法是DetailsView和FormView控件进行增删改查操作,而在asp.net 4.5时代,其gridview,formview,detailsview控件则提供了如下的属性方法,方便进行CRUD等操作
SelectMethod: 选择数据的方法,返回的数据类型是IEnumarable
InsertMethod: 进行插入相关操作
UdateMethod: 进行更新的相关操作
DeleteMethod: 进行删除的相关操作
8) 对DepartmentDetails.aspx进行修改操作如下:
▲
注意这里用AutoGenerateEditButton和AutoGenerateInsertButton分别产生了编辑和插入的按钮。
9) 修改DepartmentDetails.aspx.cs代码如下
▲
现在请仔细阅读上面的代码,注意的是上面的所有方法中,都跟前端的界面没有任何关系了,也就是说代码中没涉及任何前端界面的内容。比如在GetDepartment方法中,注意使用了[QueryString] int DeptNO的方式,自动获取了DeptNo的值,并会显示在DetailsView、表单中,而在以前的asp.net 版本中,必须使用 Request.QueryString[“DeptNo”]的方法获得。此外,请留意在三个方法中,是如何通过LINQ的方法获得department的实体对象,以及在UpdateDepartment和InsertDepartment方法中,是如何简单直接对实体进行增加和更新的。
10)打开site.master文件,修改如下:
▲
11) 运行程序,这次点每个department后,会跳转到departmentdetails.aspx的详细页,如下所示:
可以看到,这里在detailsview中,自动显示了deptno的值,并且有默认的edit和new两个连接,用于编辑和新增数据。
筛选数据
接下来,我们看下如何筛选数据。
在asp.net 4.5中,提供了System.Web.ModelBinding的命名空间,这个命名空间中包括了一些如ControlAttribute,QueryStringAttribute等类,这些类都是继承自ValueProviderSourceAttribute。这个基类是用来定义方法参数,用来指定用于模型绑定的值的来源。换句话说,这意味着传递到方法中的参数指定了要筛选记录的值是什么,以及值的来源是什么,比如来自控件还是QueryString。
下面我们继续以实做例子来讲解相关的步骤。
1) 使用Visual Studio 2011 新建立一个web工程,命名为ASPNET45_ModelBinding,增加两个文件夹Model和Employee。
2) 在Model文件夹中,增加一个ADO.NET Entitiy Framework框架向导生成的模型,命名为CompanyEDMX.edmx,使用的是SQL SERVER 2008 R2,数据库为company,建立如下的两张表结构:
Department - DeptNo (int) Primary Key, Dname (varchar(50)),Location (varchar(50)).
Employee - EmpNo (int) Primary Key, EmpName (varchar(50)),Salary (int), DeptNo(int) Foreign Key.
在向导完成后,将生成如下图的数据模型图
3)在Employee文件夹中,新建一个web页面(注意选上包括master模版页),命名为Employee.aspx,增加一个dropdownbox和一个gridview,并且设置相关的属性列表如下:
▲
整个页面代码如下:
▲
4) 打开Employees.aspx.cs,增加如下代码
▲
注意,在GetEmployees方法中,返回的类型为IQueryable,接收的参数为Deptno。这里注意使用了[Control]属性类,这个类的构造函数中,其参数定义了要接收的控件的ID。在这个例子中,源控件是DropDownList,其id名为ddlDeptName。GetEmployees方法则接收了DeptNo参数,并且通过LINQ的方式,根据DeptNo参数,筛选出相关的数据。
另外一个注意点,是在GridView中,设置了AllowPaging属性为true。在早期的asp.net 版本中,必须还是要写一点代码来进行分页,但是在asp.net 4.5时代,已经完全是零代码了,因为只要返回的数据集的类型为IQueryable,则自动绑定后的Gridview会进行自动分页。
运行以上代码,会看到如下图的结果,可以在下拉框中选择不同的部门类别进行数据筛选。
▲
本文的代码可以在如下地址下载获得:http://www.dotnetcurry.com/Uploads/ASPNET/ASPNET45_ModelBinding.zip
小结
本文以实际的例子讲解了在即将发布的ASP.NET 4.5中,web表单的绑定模型与以往的asp.net 版本有什么不同。可以看到,在ASP.NET 4.5中,更减化了程序员相关的工作,大大提高了编程的效率。