首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 資料源控件參數機制完整解析:ParameterCollection、ControlParameter 與宣告式參數綁定

     編輯:關於ASP.NET

資料源控件透過參數接收外部輸入值(查詢條件、分頁索引、更新欄位值等),實現宣告式、無代碼的資料篩選與 CRUD 操作。本文深入解析 Parameter 基類體系、ParameterCollection 管理機制與 WeatherDataSource 參數化改造實作。

參數類別體系

參數類別資料來源典型用途
Parameter程式碼指定 / 預設值基礎類別,可繼承自訂
ControlParameter伺服器控件屬性值Master/Detail、篩選條件綁定 UI 控件
QueryStringParameterURL 查詢字串書籤分享、跨頁傳值
SessionParameterSession 變數用戶偏好、權限過濾
CookieParameterCookie 值記住篩選條件、個人化
ProfileParameter用戶設定檔屬性會員專屬資料篩選
FormParameter表單欄位值POST 表單查詢條件

ParameterCollection 核心機制

  • 值更新追蹤:UpdateValues(Context, Control) 從各來源取得最新值。
  • 變更通知:ParametersChanged 事件 → 觸發 DataSourceView.RaiseChangedEvent() → 資料綁定控件重新繫結。
  • ViewState 整合:實作 IStateManager,參數集合自動持久化於 ViewState。
  • 生命週期掛鉤:OnInit 註冊 Page.LoadComplete 確保參數在繫結前更新。

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 += OnParametersChanged;
        if (IsTrackingViewState) ((IStateManager)_parameters).TrackViewState();
      }
      return _parameters;
    }
  }

  public string GetSelectedZipCode() {
    if (_parameters != null) {
      Parameter zipCodeParameter = _parameters[ZipCodeParameterName];
      if (zipCodeParameter != null) {
        IOrderedDictionary values = _parameters.GetValues(Context, this);
        return (string)values[zipCodeParameter.Name];
      }
    }
    return ZipCode; // 回退屬性值
  }

  protected override void LoadViewState(object state) {
    if (state != null) {
      Pair p = (Pair)state;
      base.LoadViewState(p.First);
      if (p.Second != null) ((IStateManager)Parameters).LoadViewState(p.Second);
    } else base.LoadViewState(null);
  }

  protected override void OnInit(EventArgs e) {
    Page.LoadComplete += 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 paramState = (_parameters != null) ? ((IStateManager)_parameters).SaveViewState() : null;
    return (baseState != null || paramState != null) ? new Pair(baseState, paramState) : null;
  }

  protected override void TrackViewState() {
    base.TrackViewState();
    if (_parameters != null) ((IStateManager)_parameters).TrackViewState();
  }
}

頁面宣告式使用範例

<asp:WeatherDataSource ID="WeatherDataSource1" runat="server">
  <SelectParameters>
    <asp:ControlParameter Name="ZipCode" ControlID="txtZipCode" PropertyName="Text" />
    <asp:QueryStringParameter Name="ZipCode" QueryStringField="zip" DefaultValue="10001" />
  </SelectParameters>
</asp:WeatherDataSource>

參數機制讓資料源控件脫離硬編碼查詢條件,實現真正的宣告式、可重用、可設計時配置的資料存取元件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved