首页 / 网页编程 / ASP.NET / ASP.NET 2.0数据源控件的参数
        
            ASP.NET 2.0数据源控件的参数2010-12-04 MSDN Nihkil数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数 据以及修改什么数据。通常情况下,页面包含一些 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();
   }
  }
}