資料源控件透過參數接收外部輸入值(查詢條件、分頁索引、更新欄位值等),實現宣告式、無代碼的資料篩選與 CRUD 操作。本文深入解析 Parameter 基類體系、ParameterCollection 管理機制與 WeatherDataSource 參數化改造實作。
| 參數類別 | 資料來源 | 典型用途 |
|---|---|---|
Parameter | 程式碼指定 / 預設值 | 基礎類別,可繼承自訂 |
ControlParameter | 伺服器控件屬性值 | Master/Detail、篩選條件綁定 UI 控件 |
QueryStringParameter | URL 查詢字串 | 書籤分享、跨頁傳值 |
SessionParameter | Session 變數 | 用戶偏好、權限過濾 |
CookieParameter | Cookie 值 | 記住篩選條件、個人化 |
ProfileParameter | 用戶設定檔屬性 | 會員專屬資料篩選 |
FormParameter | 表單欄位值 | POST 表單查詢條件 |
UpdateValues(Context, Control) 從各來源取得最新值。ParametersChanged 事件 → 觸發 DataSourceView.RaiseChangedEvent() → 資料綁定控件重新繫結。IStateManager,參數集合自動持久化於 ViewState。OnInit 註冊 Page.LoadComplete 確保參數在繫結前更新。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>
參數機制讓資料源控件脫離硬編碼查詢條件,實現真正的宣告式、可重用、可設計時配置的資料存取元件。