ASP.NET WebForm强类型URL调用:PageMethods
转载自:http://www.cnblogs.com/zhangronghua/archive/2010/03/08/PageMethodsIntroduce.html
利用URL调用页面的缺点
在简单的ASP.NET或HTML页面中链接一个页面是很简单的,但是要保证链接的页面确实存在、传递的参数都正确无误并且被正确解析却有一点不同了。下在让我们来看一个简单的例子,你想要访问一个显示客户信息的页面,这个页面需要名叫CustomerID的整形参数,所以你一般会以 "http://myserver/Customer.aspx?CustID=12"的URL来访问, 这初看起来没有问题,但如果这个页面不是你创建的,你怎么知道参数的名字?你又怎么知道参数的类型?为了得到参数的名字和类型你不得不去看代码(但你能保证代码是随时可得到的吗?)或是看文档(文档确实存在吗?即使存在又是不是最新的呢? 你确定开发者在将参数名从CustID改为CustomerID后更新了文档吗?)。
上面说的是通过URL重定向到一个页面时的限制,下面让我们来看看这种方式的其它限制:
- 你只能通过文件名引用一个页面,所以就没有编译时检查,你的错误只有在访问网页时才能被发现,这意味着你不能保证你交付的代码是100%正确的,当你意识到你犯了错误时已经晚了,你不得不在修正了错误后重新部署程序。
- 你不能确切的知道一个页面的参数或其参数集合。
- 你必须知道每个参数的确切的名字。
- 你必须以字符串的方式传递参数,这虽然可以工作但可读性却不好。
- 你不得不手工解析参数(在ASP.NET中通过URL传递的参数可以在Request.QueryString中以字符串的形式得到)。
- 页面必须验证接收到的参数(比如验证参数是否为空、参数类型是否正确、参数值是否在有效的范围内)。
PageMethods提供的解决方案
既然通过URL来调用页面有这么多的缺点,那有没有一种比较好的方式呢?下面就让我们来看看本文的主角PageMethods,PageMethods为每个页面定义了结构化的URL,所以我们可以通过一个简洁的方式调用页面。PageMethods基于严格的页面输入和参数绑定说明,在PageMethods中每个页面暴露出一些方法集合,以便我们按照不同的目的调用页面。
应用PageMethods也比较简单,你只需要在页面中添加方法,然后在需要公布的方法上添加PageMethods提供的属性,下面让我们来看一个示例,我们在Customer页面中定义了如下方法,然后在每个方法上添加了PageMethods属性,这些这些方法就可以被PageMethods类库调用了,怎么样,很简单吧。
(Customer页面的代码)
两种解决方案的比较
下面我们来分别看看用PageMethods方式和URL方式调用Customer页面的区别,首先是应用普通的URL调用方式的页面定义代码和页面调用代码:
(通过URL方式定义页面的代码)
(通过URL方式调用页面的代码)
然后是通过PageMethods类库调用方式的页面定义代码和页面调用代码:
(通过PageMethods方式的页面定义代码)
(通过PageMethods调用方式的页面调用代码)
无需多言,通过上面两段代码的对比你就能发现应用PageMethods方式调用页面是多么的方便。
在熟悉了PageMethods的基本介绍后,我们来看一个简单的示例程序,这个示例程序很简单,只有两个网页。第一个页面是客户详情编辑页面,叫做FrtmCustomer.aspx,第二个页面叫做ListCustomer.aspx,用来显示客户列表。虽然这个示例程序很简单,但用来说明PageMethods的基本使用却是很合适的,现在让我们来一步步构建这个示例程序。
步骤一:创建FrmCustomer页面
首先我们需要确定安装在VS2008中的PageMethods插件是被激活的。
然后我们创建一个ASP.NET WebSite项目(当然你也可以创建Web Application)

创建网站后,添加一个名叫"FrmCustomer.aspx"新Web Form 。
然后在新添加的Web Form中构造一个用来编辑客户ID、姓名、国家的界面,三个文本框的ID分别为txtID,txtName,txtCountry,界面如下:

然后我们在后台代码中添加用来完成新建和编辑客户的代码:

直到现在我们一直按照标准的方法来实现,还没有和PageMethods产生关系, 但从这一步我们就要用到PageMethods里面的东西了,我们需要给上面的两个方法添加PageMethods属性,这需要引用PageMethods类库(位于PageMethods.dll程序集中)。

在添加类库引用时请确保添加的是.NET2.0版本的,在添加完类库引用后,在FrmCustomer的后台类中引入MetaSapiens.PageMethods命名空间。

引入命名空间后,在方法上标注PageMethods属性。

在标注完属性后,我们还需要做一件事情,就是在页面的Page_Load方法中加入如下代码:
然后我们在项目的属性窗口中将PageMethodsEnabled属性设为true.

最后我们在配置文件中注册PageMethods的生成提供器(当然如果你选择的是Web Application,这步可以省略)
<?xml version="1.0"?>
<configuration >
<appSettings />
<system.web>
<compilation debug="true">
<buildProviders>
<add
extension=".xml"
type="MetaSapiens.PageMethods.PageMethodsBuildProvider, PageMethods" />
</buildProviders>
</compilation>
</system.web>
</configuration>
在做完了上面所有的操作后,编译代码,PageMethods将会在App_Code目录下自动生成一个叫做PageList.xml的文件,这里面包含了PageMethods要用到的代码,请不要手工编辑它。
步骤二:引用FrmCustomer页面
在定义完FrmCustomer页面后我们就需要调用它,一般来说我们我们通过HTML锚标记(<a href=…> )或是给ASP.NET HyperLink的NavigateUrl赋一个静态值来调用页面,但是在PageMethods中,我们通过后台代码来调用页面,这会带来编译时检查并保证链接是正确的。
下面让我们在Default.aspx页面中添加一个HyperLink控件

在Default.aspx的后台类中加入下面的代码以调用FrmCustomer页面:

请注意我们在编写上面的代码时是可以使用智能提示的,所以说使用上面的方式调用页面是简单且有效的,因为我们不但可以利用智能提示知道都有哪些页面和参数,还能使用编译时检查来确保调用是正确的。
做完了上面的步骤后,就可以在浏览器中打开Default.aspx页面来验证了,但是请注意,如果你使用的不是IE浏览器,请不要选择"NTLM Authentication"。

步骤三:改进FrmCustomer页面
PageMethods还提供了一些其它的属性,比如我们可以利用ParamRequired属性来声明一个引用类型(比如string)的参数是必须的,我们不能对值类型的参数应用ParamRequired属性,因为值类型的参数值不能为null.

在应用了ParamRequired属性的,如果在调用时没有传递值就会引发异常。
如果我们想重定义参数的名称,我们可以使用ParamName属性

对些一些类型的参数(如时间型、整型)我们还可以利用ParamFormat属性来定义参数的格式。

步骤四:实现ListCustomer页面
ListCustomer页面包含了客户的列表,我们新建一个叫做ListCustomer.aspx的Web Form并添加一个DataList控件。
然后编辑DataList控件的模板

在ItemTemplate中加入一个HyperLink控件

然后我们创建用来绑定数据的强类型DataSet

注意我们不需要任何数据连接或是TableAdapter对象,我们只需要定义一个叫做"Customer"的数据表,"Customer"表格有三个字段: CustID (System.Int32), Name (System.String), Country (System.String)。

现在让我们来模拟一些数据

然后给DataList控件的ItemDataBound事件添加处理程序


经过上面的步骤后我们就可以在浏览器中测试ListCustomer页面了。
更多特性
页面基类
你可能会注意到我们在FrmCustomer的Page_Load事件中调用了PageMethodsEngine.InvokeMethod() 方法,实际上你完全可以将这个调用放到自定义的基类中,或者是直接让你的页面类继承自MetaSapiens.PageMethods.BasePage类中。
默认方法
PageMethods还有一个额外的特性叫做默认方法,如果一个页面只有一个方法或是有一个主方法,我们可以在方法上引用[PageMethod(true)]属性来代替[PageMethod],这样会将方法设为默认方法,其结果是我们在调用方法时不需要在URL上添加参数。
URL格式化
如果你在项目中应用了URL重写,你可以提供给PageMethods一个格式化字符串来格式化你的URL,下面是一个示例:
上面代码的引用链接一般是" http://myserver/PageMethodsTutorial/Pages/FrmCustomer.aspx?PageMethod=EditCustomer&CustomerID=12"形式的,但当我们像下图一样应用了PageMethods.UrlFormat属性后,链接会变成"http://myserver/PageMethodsTutorial/Customer12.aspx"的形式。

了解更多
关于PageMethods的更多特性,你可以访问PageMethods的主页。

浙公网安备 33010602011771号