將驗證控制項新增至編輯和插入介面 (VB)
在本教學課程中,我們將瞭解如何將驗證控件新增至數據 Web 控件的 EditItemTemplate 和 InsertItemTemplate,以提供更易懂的使用者介面。
簡介
我們在過去三個教學課程中探索的範例中的 GridView 和 DetailsView 控件全都由 BoundFields 和 CheckBoxFields 組成, (Visual Studio 透過智慧標記將 GridView 或 DetailsView 系結至數據源控件時自動新增的字段類型) 。 在 GridView 或 DetailsView 中編輯數據列時,不是只讀的 BoundFields 會轉換成文本框,使用者可以從其中修改現有的數據。 同樣地,在 DetailsView 控制項中插入新記錄時,屬性 InsertVisible
設定為 True
(預設) 的 BoundFields 會轉譯為空白文字框,用戶可以在其中提供新記錄的域值。 同樣地,在標準唯讀介面中停用的 CheckBoxFields 會轉換成編輯和插入介面中的已啟用複選框。
雖然 BoundField 和 CheckBoxField 的預設編輯和插入介面很有説明,但介面缺少任何類型的驗證。 如果使用者發生數據輸入錯誤,例如省略 ProductName
字段或 (輸入 UnitsInStock
無效的值,例如 -50) 例外狀況將會從應用程式架構的深度引發。 雖然此例外狀況可以正常處理,如 上一個教學課程所示,但理想情況下,編輯或插入使用者介面會包含驗證控件,以防止使用者第一次輸入這類無效的數據。
為了提供自定義的編輯或插入介面,我們需要以TemplateField取代 BoundField 或 CheckBoxField。 TemplateFields 是 GridView 控件中使用 TemplateFields 和 DetailsView 控件教學課程中使用 TemplateFields 討論的主題,可以包含多個範本,定義不同數據列狀態的個別介面。 TemplateField 用於 ItemTemplate
呈現 DetailsView 或 GridView 控制項中的唯讀欄位或數據列,而 EditItemTemplate
和 InsertItemTemplate
則分別表示用於編輯和插入模式的介面。
在本教學課程中,我們將瞭解如何將驗證控件新增至 TemplateField 的 EditItemTemplate
,並提供 InsertItemTemplate
更易懂的使用者介面。 具體而言,本教學課程會採用在 檢查與插入、更新和刪除相關的事件 教學課程中建立的範例,並增強編輯和插入介面以包含適當的驗證。
步驟 1:複寫範例,以檢查與插入、更新和刪除相關聯的事件
在 檢查與插入、更新和刪除相關聯的事件 教學課程中,我們建立了一個頁面,其中列出可編輯 GridView 中產品的名稱和價格。 此外,頁面也包含 DetailsView,其 DefaultMode
屬性設定為 Insert
,因此一律會在插入模式中呈現。 在此 DetailsView 中,使用者可以輸入新產品的名稱和價格,按兩下 [插入],並將其新增至系統 (請參閱圖 1) 。
圖 1:上一個範例可讓使用者新增產品並編輯現有產品, (按兩下即可檢視完整大小的影像)
本教學課程的目標是要增強 DetailsView 和 GridView 以提供驗證控件。 特別是,我們的驗證邏輯會:
- 要求在插入或編輯產品時提供名稱
- 要求在插入記錄時提供價格;編輯記錄時,我們仍需要價格,但會使用 GridView
RowUpdating
事件處理程式中的程式設計邏輯,已從先前的教學課程中呈現 - 確定為價格輸入的值是有效的貨幣格式
我們必須先從DataModificationEvents.aspx
頁面將範例複寫到本教學課程的頁面,才能增強先前的範例以包含驗證。 UIValidation.aspx
若要達成此目的,我們必須複製 DataModificationEvents.aspx
頁面的宣告式標記及其原始程式碼。 執行下列步驟,先複製宣告式標記:
DataModificationEvents.aspx
在 Visual Studio 中開啟頁面- 移至頁面的宣告式標記 (按下頁面底部的 [來源] 按鈕)
- 複製 和
</asp:Content>
標籤內的<asp:Content>
文字, (行 3 到 44) ,如圖 2 所示。
圖 2:複製控件內的 <asp:Content>
文字 (按兩下即可檢視全大小的影像)
UIValidation.aspx
開啟頁面- 移至頁面的宣告式標記
- 貼上 控件內的
<asp:Content>
文字。
若要複製原始程式碼,請開啟DataModificationEvents.aspx.vb
頁面,並只複製 類別內的EditInsertDelete_DataModificationEvents
文字。 複製三個事件處理程式 (Page_Load
、 GridView1_RowUpdating
和 ObjectDataSource1_Inserting
) ,但 請勿 複製類別宣告。 在類別中貼上複製的EditInsertDelete_UIValidation
UIValidation.aspx.vb
文字。
將內容和程式代碼從 DataModificationEvents.aspx
UIValidation.aspx
移至 之後,請花一點時間在瀏覽器中測試進度。 您應該會在這兩個頁面中看到相同的輸出,並體驗相同的功能, (請參閱圖 1,以取得作用中) 的 DataModificationEvents.aspx
螢幕快照。
步驟 2:將 BoundFields 轉換為 TemplateFields
若要將驗證控件新增至編輯和插入介面,DetailsView 和 GridView 控件所使用的 BoundFields 必須轉換成 TemplateFields。 若要達成此目的,請分別按兩下 GridView 和 DetailsView 智慧標記中的 [編輯資料行] 和 [編輯字段] 連結。 在該處,選取每個 BoundFields,然後按兩下 [將此字段轉換成 TemplateField] 連結。
圖 3:將每個 DetailsView 和 GridView 的 BoundFields 轉換成 TemplateFields (按兩下即可檢視完整大小的影像)
透過 [字段] 對話框將 BoundField 轉換成 TemplateField,會產生一個 TemplateField,以呈現與 BoundField 本身相同的唯讀、編輯和插入介面。 下列標記顯示 DetailsView 中欄位在轉換成 TemplateField 之後的宣告式語法 ProductName
:
<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("ProductName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
請注意,此 TemplateField 有三個樣本會自動建立 ItemTemplate
、 EditItemTemplate
和 InsertItemTemplate
。 會顯示 ItemTemplate
單一數據域值 (ProductName
使用標籤 Web 控件) ,而 EditItemTemplate
和 InsertItemTemplate
則會在 TextBox Web 控件中呈現數據域值,以使用雙向數據系結將數據欄位與 TextBox 的 Text
屬性產生關聯。 由於我們只會使用此頁面中的 DetailsView 進行插入,因此您可以移除和EditItemTemplate
從這兩個 TemplateFields 中移除 ItemTemplate
,雖然離開它們並沒有任何損害。
由於 GridView 不支援 DetailsView 的內建插入功能,因此將 GridView 的 ProductName
欄位轉換成 TemplateField 只會 ItemTemplate
產生 和 EditItemTemplate
:
<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("ProductName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
單擊 [將此字段轉換成 TemplateField],Visual Studio 已建立 TemplateField,其範本會模擬已轉換 BoundField 的使用者介面。 您可以透過瀏覽器瀏覽此頁面來確認這一點。 您會發現 TemplateFields 的外觀和行為與已改用 BoundFields 的體驗相同。
注意
您可以視需要自訂範本中的編輯介面。 例如,我們可能會想要讓 TemplateFields 中的 UnitPrice
TextBox 轉譯為比文本框更小的文字框 ProductName
。 若要達成此目的,您可以將 TextBox 的 Columns
屬性設定為適當的值,或透過 Width
屬性提供絕對寬度。 在下一個教學課程中,我們將瞭解如何將 TextBox 取代為替代數據輸入 Web 控件,以完全自定義編輯介面。
步驟 3:將驗證控件新增至 GridView 的EditItemTemplate
建構數據輸入表單時,請務必讓使用者輸入任何必要欄位,而且所有提供的輸入都是合法、格式正確的值。 為了協助確保使用者的輸入有效,ASP.NET 提供五個內建驗證控件,其設計目的是要用來驗證單一輸入控件的值:
- RequiredFieldValidator 可確保已提供值
- CompareValidator 會針對另一個 Web 控件值或常數值驗證值,或確保該值的格式對指定的數據類型是合法的
- RangeValidator 可確保值在值範圍內
- RegularExpressionValidator 會針對正則表示式驗證值
- CustomValidator 會針對自定義的使用者定義方法驗證值
如需這五個控件的詳細資訊,請參閱 ASP.NET 快速入門教學課程的驗證控件一節。
在本教學課程中,我們必須在 DetailsView 和 GridView 的 ProductName
TemplateFields 和 DetailsView 的 TemplateFieldValidator 中使用 RequiredFieldValidator,以及 DetailsView 的 UnitPrice
TemplateField 中的 RequiredFieldValidator。 此外,我們需要將 CompareValidator 新增至這兩個控件 UnitPrice
的 TemplateFields,以確保輸入的價格值大於或等於 0,並以有效的貨幣格式呈現。
注意
雖然 ASP.NET 1.x 有這五個相同的驗證控件,ASP.NET 2.0 新增了一些改善,但主要兩個是 Internet Explorer 以外的瀏覽器用戶端腳本支援,以及將頁面上的驗證控件分割成驗證群組的能力。 如需 2.0 中新驗證控件功能的詳細資訊,請參閱在 ASP.NET 2.0 中剖析驗證控件。
讓我們從將必要的驗證控件新增至 EditItemTemplate
GridView 的 TemplateFields 中的 開始。 若要達成此目的,請按兩下 GridView 智慧標記中的 [編輯範本] 連結,以顯示範本編輯介面。 您可以從這裡從下拉式清單中選取要編輯的範本。 由於我們想要增強編輯介面,因此必須將驗證控制項新增至 ProductName
和 UnitPrice
的 EditItemTemplate
。
圖 4:我們需要擴充 ProductName
和 UnitPrice
的 EditItemTemplate
(按兩下即可檢視完整大小的影像)
在 中 ProductName
EditItemTemplate
,將 RequiredFieldValidator 從 [工具箱] 拖曳至範本編輯介面,並將它拖曳到 TextBox 之後。
圖 5:將 RequiredFieldValidator 新增至 ProductName
EditItemTemplate
(按兩下即可檢視完整大小的影像)
所有驗證控件的運作方式是驗證單一 ASP.NET Web 控件的輸入。 因此,我們需要指出我們剛新增的 RequiredFieldValidator 應該根據 中的 EditItemTemplate
TextBox 進行驗證;這可藉由將驗證控件的 ControlToValidate 屬性 設定為 ID
適當 Web 控件的 來完成。 TextBox 目前具有 非描述 ID
, TextBox1
但讓我們將其變更為更適當的專案。 點選取樣本中的 TextBox,然後從 屬性視窗 將變更ID
為 TextBox1
EditProductName
。
圖 6:將 TextBox 的 變更為 ID
EditProductName
(按兩下即可檢視完整大小的影像)
接下來,將 RequiredFieldValidator 的 ControlToValidate
屬性設定為 EditProductName
。 最後,將 ErrorMessage 屬性 設定為 “You must provide the product's name”,並將 Text 屬性 設定為 “*”。 Text
如果提供屬性值,則為驗證控件在驗證失敗時所顯示的文字。 ErrorMessage
ValidationSummary 控件會使用必要屬性值;如果Text
省略屬性值,ErrorMessage
屬性值也是驗證控件在無效輸入上所顯示的文字。
設定 RequiredFieldValidator 的這三個屬性之後,您的畫面看起來應該類似圖 7。
圖 7:設定 RequiredFieldValidator 的 ControlToValidate
、 ErrorMessage
和 Text
屬性, (按兩下即可檢視大小完整的影像)
將 RequiredFieldValidator 新增至 ProductName
EditItemTemplate
時,所有保留專案都是將必要的驗證新增至 UnitPrice
EditItemTemplate
。 由於我們已決定在此頁面中, UnitPrice
編輯記錄時是選擇性的,因此不需要新增 RequiredFieldValidator。 不過,我們需要新增 CompareValidator,以確保 UnitPrice
如果提供,則會正確格式化為貨幣,且大於或等於 0。
將 CompareValidator 新增至 UnitPrice
EditItemTemplate
之前,讓我們先將 TextBox Web 控制件的識別碼從 TextBox2
變更為 EditUnitPrice
。 進行這項變更之後,將 CompareValidator 的 屬性EditUnitPrice
設定ControlToValidate
為 ,其 ErrorMessage
屬性會設定為 「價格必須大於或等於零,且不能包含貨幣符號」,並將其Text
屬性設定為 “*”。
若要指出UnitPrice
值必須大於或等於 0,請將 CompareValidator 的 Operator 屬性GreaterThanEqual
設定為 ,其 ValueToCompare 屬性設定為 “0”,並將 Type 屬性設定為 Currency
。 下列宣告式語法顯示 UnitPrice
TemplateField EditItemTemplate
在進行這些變更之後的 :
<EditItemTemplate>
<asp:TextBox ID="EditUnitPrice" runat="server"
Text='<%# Bind("UnitPrice", "{0:c}") %>'
Columns="6"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="EditUnitPrice"
ErrorMessage="The price must be greater than or equal to zero and
cannot include the currency symbol"
Operator="GreaterThanEqual" Type="Currency"
ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>
進行這些變更之後,請在瀏覽器中開啟頁面。 如果您嘗試在編輯產品時省略名稱或輸入無效的價格值,文字框旁邊會出現星號。 如圖 8 所示,包含貨幣符號的價格值,例如 $19.95 會被視為無效。 CompareValidator 的 Currency
Type
允許數位分隔符 (例如逗號或句點,視文化特性設定) 和前置加號或減號而定,但 不允許 貨幣符號。 此行為可能會讓使用者感到困惑,因為編輯介面目前會使用貨幣格式轉 UnitPrice
譯 。
注意
回想一下,在 與插入、更新和刪除相關聯的事件 教學課程中,我們會將 BoundField 的 DataFormatString
屬性 {0:c}
設定為 ,以便將其格式化為貨幣。 此外,我們將 屬性設定 ApplyFormatInEditMode
為 true,導致 GridView 的編輯介面將 格式化 UnitPrice
為貨幣。 將 BoundField 轉換成 TemplateField 時,Visual Studio 會指出這些設定,並使用數據系結語法<%# Bind("UnitPrice", "{0:c}") %>
將 TextBox 的 Text
屬性格式化為貨幣。
圖 8:出現星號出現在 [無效輸入] ([按兩下] 以檢視大小完整的影像)
當驗證依原樣運作時,用戶必須在編輯記錄時手動移除貨幣符號,這是無法接受的。 若要解決此問題,我們有三個選項:
EditItemTemplate
設定 ,以便UnitPrice
將值格式化為貨幣。- 允許使用者藉由移除 CompareValidator 並取代為 RegularExpressionValidator 來輸入貨幣符號,以正確檢查格式正確的貨幣值。 以下是驗證貨幣值的正則表達式並不美觀,如果我們想要納入文化特性設定,則需要撰寫程序代碼。
- 完全移除驗證控制項,並依賴 GridView 事件處理程式中的
RowUpdating
伺服器端驗證邏輯。
讓我們在此練習中使用選項 #1。 目前的格式 UnitPrice
為貨幣,因為 中的 EditItemTemplate
TextBox 數據系結表示式: <%# Bind("UnitPrice", "{0:c}") %>
。 將 Bind 語句變更為 Bind("UnitPrice", "{0:n2}")
,將結果格式化為具有兩位數有效位數的數位。 這可以直接透過宣告式語法完成,或按兩下TemplateField EditItemTemplate
(中 TextBox 的 UnitPrice
[編輯 DataBindings] 連結EditUnitPrice
,請參閱圖 9 和 10) 。
圖 9:按兩下 TextBox 的 [編輯 DataBindings] 連結 (按兩下即可檢視大小完整的影像)
圖 10:在語句中 Bind
指定格式規範 (按兩下即可檢視大小完整的影像)
透過這項變更,編輯介面中的格式化價格會包含逗號做為群組分隔符,而句點做為小數分隔符,但會離開貨幣符號。
注意
UnitPrice
EditItemTemplate
不包含 RequiredFieldValidator,允許回傳加入,以及開始更新邏輯。 不過, RowUpdating
從 檢查與插入、更新和刪除相關聯的事件 ,複製的事件處理程式包含程式設計檢查,以確保 UnitPrice
提供 。 請隨意移除此邏輯、保持原樣,或將 RequiredFieldValidator 新增至 UnitPrice
EditItemTemplate
。
步驟 4:摘要數據輸入問題
除了五個驗證控制項之外,ASP.NET 還包含 ValidationSummary 控制件,其會顯示 ErrorMessage
偵測到無效資料的驗證控制件的 。 此摘要數據可以在網頁或透過強制回應的用戶端消息框顯示為文字。 讓我們增強本教學課程,以包含摘要任何驗證問題的用戶端消息框。
若要達成此目的,請將 ValidationSummary 控件從 [工具箱] 拖曳至 Designer。 驗證控件的位置並不重要,因為我們將設定為只將摘要顯示為消息框。 新增控制項之後,將其 ShowSummary 屬性 設定為 False
,並將其 ShowMessageBox 屬性 設定為 True
。 此外,用戶端消息框中會摘要說明任何驗證錯誤。
圖 11:驗證錯誤摘要顯示在 Client-Side [訊息] 方塊中, (按兩下即可檢視大小完整的映像)
步驟 5:將驗證控件新增至 DetailsView 的InsertItemTemplate
本教學課程保留的一切,就是將驗證控件新增至 DetailsView 的插入介面。 將驗證控件新增至 DetailsView 範本的程式與步驟 3 中所檢查的程式相同;因此,我們將逐步完成此步驟中的工作。 如同使用 GridView 的EditItemTemplate
,我們鼓勵您將 TextBox 的 s 從非描述TextBox1
和 TextBox2
重新命名ID
為 InsertProductName
和 InsertUnitPrice
。
將 RequiredFieldValidator 新增至 ProductName
InsertItemTemplate
。 將 ControlToValidate
設定為 ID
範本中 TextBox 的 ,其 Text
屬性設定為 “*”,並將其 ErrorMessage
屬性設定為 “You must provide the product's name”。
UnitPrice
由於新增記錄時,此頁面需要 ,因此請將 RequiredFieldValidator 新增至 UnitPrice
InsertItemTemplate
,並適當地設定其ControlToValidate
、 Text
和 ErrorMessage
屬性。 最後,同時將 CompareValidator 新增至 UnitPrice
InsertItemTemplate
,並設定其 ControlToValidate
、Text
、ErrorMessage
、Type
、、 Operator
和 ValueToCompare
屬性,就像我們在 GridView EditItemTemplate
中的 CompareValidator 一樣UnitPrice
。
新增這些驗證控件之後,如果未提供新的產品名稱,或是其價格是負數或不合法格式化,則無法新增至系統。
圖 12:驗證邏輯已新增至 DetailsView 的 [插入介面] (按兩下即可檢視大小完整的影像)
步驟 6:將驗證控件分割成驗證群組
我們的頁面包含兩組邏輯上不同的驗證控件:對應至 GridView 編輯介面的控件,以及對應至 DetailsView 插入介面的控件。 根據預設,會檢查頁面上 的所有 驗證控件發生回傳時。 不過,編輯記錄時,我們不希望 DetailsView 的插入介面驗證控件進行驗證。 圖 13 說明當使用者以完全合法值編輯產品時目前的問題,按兩下 [更新] 會導致驗證錯誤,因為插入介面中的名稱和價格值是空白的。
圖 13:更新產品會導致插入介面的驗證控件引發 (按兩下即可檢視大小完整的映像)
ASP.NET 2.0 中的驗證控制項可以透過其 ValidationGroup
屬性分割成驗證群組。 若要將群組中的一組驗證控件建立關聯,只要將其 ValidationGroup
屬性設定為相同的值即可。 在本教學課程中,將 ValidationGroup
GridView 的 TemplateFields 中的驗證控件屬性設定為 EditValidationControls
,並將 ValidationGroup
DetailsView 的 TemplateFields 屬性設定為 InsertValidationControls
。 這些變更可以直接在宣告式標記中完成,或使用 Designer 的編輯範本介面時透過 屬性視窗 來完成。
除了驗證控件之外,ASP.NET 2.0 中的 Button 和 Button 相關控件也包含 ValidationGroup
屬性。 只有在具有相同 ValidationGroup
屬性設定的 Button 引發回傳時,才會檢查驗證群組的驗證程式是否有效。 例如,為了讓DetailsView的 [插入] 按鈕觸發 InsertValidationControls
驗證群組,我們需要將 CommandField 的 ValidationGroup
屬性設定為 InsertValidationControls
(請參閱圖 14) 。 此外,將 GridView 的 CommandField ValidationGroup
屬性設定為 EditValidationControls
。
圖 14:將 DetailsView 的 CommandField ValidationGroup
屬性設定為 InsertValidationControls
(按兩下即可檢視完整大小的影像)
這些變更之後,DetailsView 和 GridView 的 TemplateFields 和 CommandFields 看起來應該如下所示:
DetailsView 的 TemplateFields 和 CommandField
<asp:TemplateField HeaderText="ProductName"
SortExpression="ProductName">
<InsertItemTemplate>
<asp:TextBox ID="InsertProductName" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2"
runat="server" ControlToValidate="InsertProductName"
ErrorMessage="You must provide the product name"
ValidationGroup="InsertValidationControls">*
</asp:RequiredFieldValidator>
</InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
<InsertItemTemplate>
<asp:TextBox ID="InsertUnitPrice" runat="server"
Text='<%# Bind("UnitPrice") %>' Columns="6">
</asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator3"
runat="server" ControlToValidate="InsertUnitPrice"
ErrorMessage="You must provide the product price"
ValidationGroup="InsertValidationControls">*
</asp:RequiredFieldValidator>
<asp:CompareValidator ID="CompareValidator2" runat="server"
ControlToValidate="InsertUnitPrice"
ErrorMessage="The price must be greater than or equal to zero and
cannot include the currency symbol"
Operator="GreaterThanEqual" Type="Currency" ValueToCompare="0"
ValidationGroup="InsertValidationControls">*
</asp:CompareValidator>
</InsertItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowInsertButton="True"
ValidationGroup="InsertValidationControls" />
GridView 的 CommandField 和 TemplateFields
<asp:CommandField ShowEditButton="True" ValidationGroup="EditValidationControls" />
<asp:TemplateField HeaderText="ProductName"
SortExpression="ProductName">
<EditItemTemplate>
<asp:TextBox ID="EditProductName" runat="server"
Text='<%# Bind("ProductName") %>'>
</asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server" ControlToValidate="EditProductName"
ErrorMessage="You must provide the product name"
ValidationGroup="EditValidationControls">*
</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("ProductName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
<EditItemTemplate>
<asp:TextBox ID="EditUnitPrice" runat="server"
Text='<%# Bind("UnitPrice", "{0:n2}") %>' Columns="6"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="EditUnitPrice"
ErrorMessage="The price must be greater than or equal to zero and
cannot include the currency symbol"
Operator="GreaterThanEqual" Type="Currency"
ValueToCompare="0"
ValidationGroup="EditValidationControls">*
</asp:CompareValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server"
Text='<%# Bind("UnitPrice", "{0:c}") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
此時,只有在按兩下 GridView 的 [更新] 按鈕時,才會引發編輯特定的驗證控件,而且只有在按兩下DetailsView的 [插入] 按鈕時才會引發插入特定的驗證控件,解決圖 13 所反白顯示的問題。 不過,使用此變更時,我們的 ValidationSummary 控件不會再顯示輸入無效的數據。 ValidationSummary 控件也包含 ValidationGroup
屬性,而且只會在其驗證群組中顯示這些驗證控件的摘要資訊。 因此,我們需要在此頁面中擁有兩個驗證控制項,用於 InsertValidationControls
驗證群組,另一個用於 EditValidationControls
。
<asp:ValidationSummary ID="ValidationSummary1" runat="server"
ShowMessageBox="True" ShowSummary="False"
ValidationGroup="EditValidationControls" />
<asp:ValidationSummary ID="ValidationSummary2" runat="server"
ShowMessageBox="True" ShowSummary="False"
ValidationGroup="InsertValidationControls" />
在本教學課程中,我們的教學課程已完成!
摘要
雖然 BoundFields 可以同時提供插入和編輯介面,但無法自定義介面。 通常,我們想要將驗證控件新增至編輯和插入介面,以確保使用者以合法格式輸入必要的輸入。 若要達成此目的,我們必須將 BoundFields 轉換成 TemplateFields,並將驗證控件新增至適當的範本 () 。 在本教學課程中,我們已從 檢查與插入、更新和刪除相關聯的事件 教學課程擴充範例,將驗證控件新增至 DetailsView 的插入介面和 GridView 的編輯介面。 此外,我們已瞭解如何使用 ValidationSummary 控件顯示摘要驗證資訊,以及如何將頁面上的驗證控件分割成不同的驗證群組。
如本教學課程中所見,TemplateFields 允許編輯和插入介面擴增,以包含驗證控件。 TemplateFields 也可以擴充以包含其他輸入 Web 控件,讓 TextBox 可由更適當的 Web 控件取代。 在下一個教學課程中,我們將瞭解如何使用數據系結的DropDownList控件來取代 TextBox 控制件,這在編輯外鍵 (時很理想,例如 CategoryID
或 SupplierID
Products
數據表) 。
快樂的程序設計!
關於作者
Scott Mitchell 是七份 ASP/ASP.NET 書籍的作者,以及 自 1998 年以來與 Microsoft Web 技術合作的 4GuysFromRolla.com 作者。 Scott 是獨立顧問、訓練員和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以透過mitchell@4GuysFromRolla.com部落格來連線到 ,您可以在 找到http://ScottOnWriting.NET。
特別感謝
本教學課程系列是由許多實用的檢閱者檢閱。 本教學課程的首席檢閱者是 Liz Shulok 和 Zack Jones。 有興趣檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行 mitchell@4GuysFromRolla.com放在 。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應