QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

asp.net基础

ASP.NET2.0中使用数据源控件之参数

 admin  2013-09-04 09:15:00

     数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数据以及修改什么数据。通常情况下,页面包含一些 UI,以定义那些必须在选择操作中使用的参数,而数据绑定控件提供了参数值来进行插入、更新和删除操作。但是,在任意一种情况下,都可能同时出现两种现象。在第 1 部分中,数据源控件揭示了 ZipCode 属性,该属性可进行声明性设置,或者以编码来设置以响应用户操作。参数被设计为以声明性(且可扩展)的方式来完成此方案。

  引言

  Parameter 基类代表一个通用参数。Microsoft Visual Studio 2005 提供了诸如 QueryStringParameter 之类的参数,以便将数据从查询字符串参数请求到数据源中。另一个非常有用的参数是 ControlParameter,该参数允许从任一控件属性中请求数据。如果内置参数类型不能满足您的要求,则您可以定义自己的参数类型。这样您就可以使页面与粘接代码不相关,而是将该代码整齐地封装在参数实现中。

  除了从不同的源中请求值,这些参数还可以跟踪值的更改情况,并通知这些更改的所属数据源,进而引发数据源更改通知,最终在数据绑定控件中触发数据绑定操作。简而言之,这就是使用 ControlParameters 时,主要的声明性详细方案所依据的原理。

  示例

  在此将向 WeatherDataSource 添加参数功能,然后进一步阐述。

  1. public class WeatherDataSource : DataSourceControl { 
  2.  
  3.  public static readonly string ZipCodeParameterName = "ZipCode"
  4.  ... 
  5.  
  6.  private ParameterCollection _parameters; 
  7.  
  8.  private ParameterCollection Parameters { 
  9.   get { 
  10.    if (_parameters == null) { 
  11.     _parameters = new ParameterCollection(); 
  12.     _parameters.ParametersChanged += new EventHandler(this.OnParametersChanged); 
  13.     if (IsTrackingViewState) { 
  14.      ((IStateManager)_parameters).TrackViewState(); 
  15.     } 
  16.    } 
  17.    return _parameters; 
  18.   } 
  19.  } 
  20.  ... 
  21.  
  22.  public string GetSelectedZipCode() { 
  23.   if (_parameters != null) { 
  24.    Parameter zipCodeParameter = _parameters[ZipCodeParameterName]; 
  25.    if (zipCodeParameter != null) { 
  26.     IOrderedDictionary parameterValues = _parameters.GetValues(Context, this); 
  27.     return (string)parameterValues[zipCodeParameter.Name]; 
  28.    } 
  29.   } 
  30.  
  31.   return ZipCode; 
  32.  } 
  33.  
  34.  protected override void LoadViewState(object state) { 
  35.   object baseState = null
  36.  
  37.   if (state != null) { 
  38.    Pair p = (Pair)state; 
  39.    baseState = p.First; 
  40.  
  41.    if (p.Second != null) { 
  42.     ((IStateManager)Parameters).LoadViewState(p.Second); 
  43.    } 
  44.   } 
  45.   base.LoadViewState(baseState); 
  46.  } 
  47.  
  48.  protected override void OnInit(EventArgs e) { 
  49.   Page.LoadComplete += new EventHandler(this.OnPageLoadComplete); 
  50.  } 
  51.  
  52.  private void OnPageLoadComplete(object sender, EventArgs e) { 
  53.   if (_parameters != null) { 
  54.    _parameters.UpdateValues(Context, this); 
  55.   } 
  56.  } 
  57.  
  58.  private void OnParametersChanged(object sender, EventArgs e) { 
  59.   CurrentConditionsView.RaiseChangedEvent(); 
  60.  } 
  61.  
  62.  protected override object SaveViewState() { 
  63.   object basebaseState = base.SaveViewState(); 
  64.   object parameterState = null
  65.  
  66.   if (_parameters != null) { 
  67.    parameterState = ((IStateManager)_parameters).SaveViewState(); 
  68.   } 
  69.  
  70.   if ((baseState != null) || (parameterState != null)) { 
  71.    return new Pair(baseState, parameterState); 
  72.   } 
  73.   return null; 
  74.  } 
  75.  
  76.  protected override void TrackViewState() { 
  77.   base.TrackViewState(); 
  78.   if (_parameters != null) { 
  79.    ((IStateManager)_parameters).TrackViewState(); 
  80.   } 
  81.  } 

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

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

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

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

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

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

  1. private sealed class WeatherDataSourceView : DataSourceView { 
  2.  ... 
  3.  
  4.  internal Weather GetWeather() { 
  5.   string zipCode = _owner.GetSelectedZipCode(); 
  6.   if (zipCode.Length == 0) { 
  7.    return null; 
  8.   } 
  9.  
  10.   WeatherService weatherService = new WeatherService(zipCode); 
  11.   return weatherService.GetWeather(); 
  12.  } 

完整的代码就是这个样子。以下是经过更新的用法示例,该示例现在是声明性的。

  1. Zip Code: <asp:TextBox runat="server" id="zipCodeTextBox" /> 
  2. <asp:Button runat="server" Text="查找" /> 
  3. <hr /> 
  4.  
  5. <asp:FormView runat="server" DataSourceID="weatherDS"> 
  6. <ItemTemplate> 
  7. <asp:Label runat="server" 
  8. Text='<%# Eval("Temperature",  
  9. "当前温度是 {0}。") %>' /> 
  10. </ItemTemplate> 
  11. </asp:FormView> 
  12. <nk:WeatherDataSource runat="server" id="weatherDS"> 
  13. <Parameters> 
  14. <asp:ControlParameter Name="ZipCode" ControlID="zipCodeTextBox" /> 
  15. </Parameters> 
  16. </nk:WeatherDataSource> 

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

¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《ASP.NET2.0中使用数据源控件之参数》发布于石头博客文章,作者:admin,如若转载,请注明出处:https://www.pweb123.com/html/aspnet/199.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序