asp.net|控制項|資料|資料來源 資料來源控制項是 Microsoft Visual Studio 2005 中引入的一種新型伺服器控制項,它們是資料繫結體繫結構的一個關鍵區段,能夠通過資料繫結控制項來提供宣告式程式設計模型和自動資料繫結行為。本文及此系列中的後續幾篇文章將介紹實現資料來源控制項的核心內容。
引言
簡而言之,資料來源控制項概括了一個資料存放區和可以針對所包含的資料執行的一些操作。DataBound 控制項通過其 DataSourceID 屬性與一個資料來源控制項相關聯。大多數傳統的資料存放區要麼是表格格式,要麼是分層的,資料來源控制項也相應地分為兩類。在此要介紹的是表格格式的資料來源控制項。
資料來源控制項自身並不能發揮多大作用;所有邏輯都封裝在 DataSourceView 派生的類中。至少有一個 DataSourceView 必須實現檢索(即 SELECT)一組行的功能。它可以提供修改資料(即 INSERT、UPDATE 和 DELETE)的功能(可選)。資料繫結控制項可通過各種 Can??? 屬性來檢查啟用功能集。資料來源控制項本身只是一個或多個唯一命名視圖的容器。依據慣例,預設視圖可以按其名稱進行訪問,也可以為空白。不同視圖之間是否存在關係或者存在怎樣的關係可以根據每個資料來源控制項的實現情況來進行適當的定義。例如,某個資料來源控制項可能會通過不同的視圖對同一個資料提供不同的經篩選的視圖,或者可能會在輔助視圖中提供一組子行。可使用資料繫結控制項的 DataMember 屬性來選擇某個特殊的視圖(如果該資料來源控制項提供了多個視圖)。請注意,Whidbey 中的所有內建資料來源控制項目前都不提供多個視圖。
最後再介紹一點內容。資料來源控制項(及其視圖)會實現兩組 API。第一組 API 是就四種常用的資料操作而定義的一個抽象介面,以常規方式從任一資料繫結控制項中使用。第二組是可選的,它使用其表示的域或資料存放區方面的術語來定義,通常被強型別化,且面嚮應用程式開發人員。
樣本
在這些文章中,將實現一個 WeatherDataSource,它將針對由 weather.com(英文)提供的 REST(英文)XML API 來工作,以便根據郵遞區號來檢索天氣資訊。通常會首先實現派生的資料來源控制項。
public class WeatherDataSource : DataSourceControl {
public static readonly string
CurrentConditionsViewName = "CurrentConditions";
private WeatherDataSourceView _currentConditionsView;
private WeatherDataSourceView CurrentConditionsView {
get {
if (_currentConditionsView == null) {
_currentConditionsView = new WeatherDataSourceView(this, CurrentConditionsViewName);
}
return _currentConditionsView;
}
}
public string ZipCode {
get {
string s = (string)ViewState["ZipCode"];
return (s != null) ? s : String.Empty;
}
set {
if (String.Compare(value, ZipCode,
StringComparison.Ordinal) != 0) {
ViewState["ZipCode"] = value;
CurrentConditionsView.RaiseChangedEvent();
}
}
}
protected override DataSourceView GetView(string viewName) {
if (String.IsNullOrEmpty(viewName) ||
(String.Compare(viewName, CurrentConditionsViewName,
StringComparison.OrdinalIgnoreCase) == 0)) {
return CurrentConditionsView;
}
throw new ArgumentOutOfRangeException("viewName");
}
protected override ICollection GetViewNames() {
return new string[] { CurrentConditionsViewName };
}
public Weather GetWeather() {
return CurrentConditionView.GetWeather();
}
}
如您所見,基本的理念是實現 GetView 以返回一個命名視圖執行個體,以及實現 GetViewNames 以返回可用視圖集。
在此選擇從 DataSourceControl 中派生。有一點是不易察覺的,事實上資料繫結控制項要尋找 IDataSource 介面,而 DataSource 控制項通過實現 GetView 和 GetViewNames 來實現該介面。之所以需要介面是為了使資料來源控制項能夠既是表格格式又是分層的(如果可能的話),在這種情況下從主要模型中派生並將另一個模型作為介面來實現)。其次,還允許在各種方案中轉換其他控制項,以使資料來源的容量加倍。 另外還要注意公用 ZipCode 屬性和返回強型別化 Weather 對象的 GetWeather 方法。此 API 適合於頁面開發人員。頁面開發人員無需考慮 DataSourceControl 和 DataSourceView。
[1] [2] 下一頁