选择显示字体大小

asp.net2.0中使用数据源控件之参数


  数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数据以及修改什么数据。通常情况下,页面包含一些 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();
  }
 }
}

  microsoft asp.net 提供了 parametercollection,您可以完全按原样使用该集合。它同时包含更改跟踪和状态管理功能。您只需相应地调用该集合的 api 来合并这些功能,另外还可以在控件外将该集合揭示为属性。在上述代码中,需要注意的关键点为:

  ·该数据源控件揭示了一个 parametercollection 类型的属性,以使开发人员能够添加表示要使用的邮政编码值的参数。如果已经设置了参数,则使用该参数;否则,将使用 zipcode 属性值。

  ·该控件替代了与状态管理相关的方法,以请求 parametercollection 中内置的状态管理功能。

  ·该控件使用页面生命周期的新 loadcomplete 事件来更新参数值,它通过替代 oninit 来注册这些值。如果在初始化、回发处理或页面编码(当引发 loadcomplete 时,全部都会发生)期间更改了任何参数的值,则该数据源控件还会注册 parametercollection 所引发的 parameterschanged 事件。与上述情况一样,如果设置了 zipcode 属性,将会引发更改通知,向数据绑定控件指明它需要再次执行数据绑定操作(随后在 prerender 期间将会发生此情况)。

  ·需要参与生命周期是数据源作为控件(即使是非可视控件)来实现的一个原因。另一个原因是为了使数据绑定控件能够通过使用其 datasourceid 属性来使用 findcontrol,并能够获得基于 inamingcontainer 的分层名称领域的益处(这样就能够实现嵌套数据方案,方法是在模板内放置一个数据源控件,并使其在每行中重复一次)。数据源是控件这一事实早已是争论的焦点 - 但愿这能够说明此问题的一些论据。

  在此 datasourceview 只需调用 getselectedzipcode,而不是直接使用 zipcode 属性。此外,还更改了数据源视图代码,以便在未选中 zipcode 的情况下返回 null(而不是抛出异常),这会导致数据绑定控件显示“空”视图。这在通常情况下是一个惯例,但是回顾来看,这应该成为数据源控件语义的一个不可获缺的方面。

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>

  请注意,在标记中并未指定 text 作为在 controlparameter 标记上查找的属性。controlparameter 自动计算出了在未指定属性的情况下要使用的默认属性。它通过检查该类中的 controlvalueattribute 来实现此目的。textbox 将 text 定义为包含其“控件值”的属性。除了传统输入控件之外,此概念还适用于多个控件。例如,gridview 将其 selecteddatakey 揭示为“控件值”。这是一个新事物,控件开发人员从此以后应该予以考虑,以便与 controlparameter 更好地进行集成。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons