数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数据以及修改什么数据。通常情况下,页面包含一些 ui,以定义那些必须在选择操作中使用的参数,而数据绑定控件提供了参数值来进行插入、更新和删除操作。但是,在任意一种情况下,都可能同时出现两种现象。 在第 1 部分中,数据源控件揭示了 zipcode 属性,该属性可进行声明性设置,或者以编码来设置以响应用户操作。参数被设计为以声明性(且可扩展)的方式来完成此方案。
引言
parameter 基类代表一个通用参数。microsoft visual studio 2005 提供了诸如 querystringparameter 之类的参数,以便将数据从查询字符串参数请求到数据源中。另一个非常有用的参数是 controlparameter,该参数允许从任一控件属性中请求数据。如果内置参数类型不能满足您的要求,则您可以定义自己的参数类型。这样您就可以使页面与粘接代码不相关,而是将该代码整齐地封装在参数实现中。
除了从不同的源中请求值,这些参数还可以跟踪值的更改情况,并通知这些更改的所属数据源,进而引发数据源更改通知,最终在数据绑定控件中触发数据绑定操作。简而言之,这就是使用 controlparameters 时,主要的声明性详细方案所依据的原理。
示例
在此将向 weatherdatasource 添加参数功能,然后进一步阐述。
| public class weatherdatasource : datasourcecontrol { public static readonly string zipcodeparametername = "zipcode"; ... private parametercollection _parameters; private parametercollection parameters { get { if (_parameters == null) { _parameters = new parametercollection(); _parameters.parameterschanged += new eventhandler(this.onparameterschanged); if (istrackingviewstate) { ((istatemanager)_parameters).trackviewstate(); } } return _parameters; } } ... public string getselectedzipcode() { if (_parameters != null) { parameter zipcodeparameter = _parameters[zipcodeparametername]; if (zipcodeparameter != null) { iordereddictionary parametervalues = _parameters.getvalues(context, this); return (string)parametervalues[zipcodeparameter.name]; } } return zipcode; } protected override void loadviewstate(object state) { object basestate = null; if (state != null) { pair p = (pair)state; basestate = p.first; if (p.second != null) { ((istatemanager)parameters).loadviewstate(p.second); } } base.loadviewstate(basestate); } protected override void oninit(eventargs e) { page.loadcomplete += new eventhandler(this.onpageloadcomplete); } private void onpageloadcomplete(object sender, eventargs e) { if (_parameters != null) { _parameters.updatevalues(context, this); } } private void onparameterschanged(object sender, eventargs e) { currentconditionsview.raisechangedevent(); } protected override object saveviewstate() { object basestate = base.saveviewstate(); object parameterstate = null; if (_parameters != null) { parameterstate = ((istatemanager)_parameters).saveviewstate(); } if ((basestate != null) (parameterstate != null)) { return new pair(basestate, parameterstate); } return null; } protected override void trackviewstate() { base.trackviewstate(); if (_parameters != null) { ((istatemanager)_parameters).trackviewstate(); } } } |
| private sealed class weatherdatasourceview : datasourceview { ... internal weather getweather() { string zipcode = _owner.getselectedzipcode(); if (zipcode.length == 0) { return null; } weatherservice weatherservice = new weatherservice(zipcode); return weatherservice.getweather(); } } |
| zip code: <asp:textbox runat="server" id="zipcodetextbox" /> <asp:button runat="server" text="查找" /> <hr /> <asp:formview runat="server" datasourceid="weatherds"> <itemtemplate> <asp:label runat="server" text='<%# eval("temperature", "当前温度是 {0}。") %>' /> </itemtemplate> </asp:formview> <nk:weatherdatasource runat="server" id="weatherds"> <parameters> <asp:controlparameter name="zipcode" controlid="zipcodetextbox" /> </parameters> </nk:weatherdatasource> |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器