HOW TO:驗證資料
您可以將「驗證規則」(Validation Rule) 套用到實體或資料表,以確保正確格式化的資料會寫入至資料來源。驗證規則是一種您的應用程式中的資料必須遵守的條件或條件約束。您可以將一個或多個驗證規則加入到 LightSwitch 的實體或資料表中。如果使用者新增或變更資料,且該資料不符合驗證規則,則 LightSwitch 會顯示錯誤。使用者可以認可資料之前,必須先修正驗證錯誤。
下圖顯示驗證錯誤訊息。
LightSwitch 包含數個內建的驗證規則。您可以設定這些規則,並將它們套用至實體或資料表,無需撰寫任何程式碼。您還可以使用程式碼來定義自訂的驗證規則。
此主題包括下列章節:
將預先定義的驗證規則套用至欄位
將自訂驗證規則套用至欄位
將自訂驗證規則套用至畫面中的資料
套用儲存資料時執行的驗證規則
如需相關的視訊示範,請參閱如何撰寫 LightSwitch 應用程式中用於驗證和計算欄位的商務規則? (英文)。
將預先定義的驗證規則套用至欄位
LightSwitch 包含數個內建的驗證規則,無需撰寫任何自訂程式碼即可使用。您可以將這些規則套用至個別的資料欄位,或套用至使用者在畫面中的資料進行的任何更新類型。
若要將預先定義的驗證規則套用至欄位
在 [方案總管] 中,按兩下您要套用驗證規則的實體或資料表。
實體或資料表會在 [資料設計工具] 中開啟。
在 [資料設計工具] 中,選取您要驗證的欄位。
在 [屬性] 視窗的 [驗證] 區段中,設定任何屬性的值。
如需驗證屬性的詳細資訊,請參閱參考:資料設計工具屬性。
將自訂驗證規則套用至欄位
您可以透過撰寫程式碼來定義自訂的驗證規則。您可以指定 LightSwitch 何時強制執行這些驗證規則。例如,您可以指定在使用者輸入值後立即強制執行欄位的驗證規則。或者,您可以指定實體或資料表只在所有欄位都包含值之後才評估。當某個欄位中值的有效性相依於同一個實體或資料表中另一個欄位的有效值時,這種模型模式才有意義。
若要將自訂驗證規則套用至欄位
在 [方案總管] 中,按兩下您要套用驗證規則的實體或資料表。
實體或資料表會在 [資料設計工具] 中開啟。
在 [資料設計工具] 中,選取您要驗證的欄位。
在 [屬性] 視窗中,按一下 [自訂驗證]。
[程式碼編輯器] 隨即開啟,並產生名為 FieldName[_Validate] 的方法。
將驗證程式碼加入到 FieldName[_Validate] 方法。
若要在使用者提供欄位值後,立即強制執行驗證規則,請呼叫 results 參數的 AddPropertyError 方法。
下列範例會在使用者將 Order 實體的 ShippedDate 欄位設定為比今天晚的日期之後,顯示驗證訊息。
Private Sub ShippedDate_Validate(results As EntityValidationResultsBuilder) If Me.ShippedDate > DateTime.Today Then results.AddPropertyError _ ("Shipped date cannot be later than today") End If End Sub
partial void ShippedDate_Validate(EntityValidationResultsBuilder results) { if (this.ShippedDate > DateTime.Today) { results.AddPropertyError("Shipped date cannot be later than today"); } }
請注意您可以反白顯示其他屬性進行驗證。例如,您可以撰寫使用者變更客戶的郵遞區號時執行的驗證程式碼。如果 City 屬性做為參數傳遞給 AddPropertyError 方法,LightSwitch 會反白顯示 City 欄位。驗證錯誤訊息文字可以提示使用者輸入符合新郵遞區號的城市名稱。
注意事項 根據預設,在更新符合驗證規則以前,無法更新認可至資料來源。如果您要讓使用者認可未評估的更新,請使用 AddPropertyResult 方法而不是 AddPropertyError 方法。針對 AddPropertyResult 方法的第二個參數,傳入 ValidationSeverity.Informational 或 ValidationSeverity.Warning。
若要在實體或資料表上強制執行驗證規則,例如,當使用者修改的欄位值相依於另一個欄位的有效值時,請呼叫 results 參數的 AddEntityError 方法。下列範例會將 RequiredDate 欄位的值與 OrderDate 欄位的值進行比較。如果訂單日期晚於必要日期,此程式碼會顯示驗證錯誤訊息。
Private Sub RequiredDate_Validate(results As EntityValidationResultsBuilder) If Me.RequiredDate < Me.OrderDate Then results.AddEntityError _ ("Required data cannot be earlier than the order date") End If End Sub
partial void RequiredDate_Validate(EntityValidationResultsBuilder results) { if (this.RequiredDate < this.OrderDate) { results.AddEntityError ("Required data cannot be earlier than the order date"); } }
將自訂驗證規則套用至畫面中的資料
您可以將自訂程式碼加入到畫面程式碼檔中的 <實體或資料表名稱>[_Validate] 方法,指定將應用到整個畫面的自訂驗證規則。當使用者修改畫面中的任何資料 (例如,加入或刪除資料) 時,會執行您自訂的程式碼。執行這些規則,然後才能儲存資料。
若要將自訂驗證規則套用至畫面中的資料
在 [方案總管] 中,按兩下要指定驗證規則的畫面。
在 [畫面設計工具] 頂端,按一下 [撰寫程式碼]。
[程式碼編輯器] 隨即開啟。
在 [宣告] 功能表上,選取 <實體或資料表名稱>[_Validate]。
名為 <實體或資料表名稱>[_Validate] 的程式碼區塊就會出現在程式碼檔中。
將自訂驗證程式碼加入到 <實體或資料表名稱>[_Validate] 方法。
若要在使用者加入、刪除或更新資料列之後,強制執行驗證規則,請呼叫 results 參數的 AddScreenError 方法。
下列範例防止刪除位於美國的客戶。
Private Sub Customers_Validate _ (results As Microsoft.LightSwitch.Framework.Client.ScreenValidationResultsBuilder) If Me.DataWorkspace.NorthwindData.Details.HasChanges Then Dim changeSet As EntityChangeSet = _ Me.DataWorkspace.NorthwindData.Details.GetChanges() Dim entity As IEntityObject For Each entity In changeSet.DeletedEntities.OfType(Of Customer)() Dim cust As Customer = CType(entity, Customer) If cust.Country = "USA" Then entity.Details.DiscardChanges() results.AddScreenResult("Unable to remove this customer." & _ "Cannot delete customers that are located in the USA.", _ ValidationSeverity.Informational) End If Next End If End Sub
partial void Customers_Validate(ScreenValidationResultsBuilder results) { if (this.DataWorkspace.NorthwindData.Details.HasChanges) { EntityChangeSet changeSet = this.DataWorkspace.NorthwindData.Details.GetChanges(); foreach (IEntityObject entity in changeSet.DeletedEntities.OfType<Customer>()) { Customer cust = (Customer)entity; if (cust.Country == "USA") { entity.Details.DiscardChanges(); results.AddScreenResult("Unable to remove this customer. " + "Cannot delete customers that are located in the USA.", ValidationSeverity.Informational); } } } }
注意事項 根據預設,在更新符合驗證規則以前,無法更新認可至資料來源。如果您要讓使用者認可未評估的更新,請使用 AddScreenResult 方法而不是 AddScreenError 方法。針對 AddScreenResult 方法的第二個參數,傳入 ValidationSeverity.Informational 或 ValidationSeverity.Warning。
套用儲存資料時執行的驗證規則
當使用者儲存資料時,或當您的程式碼呼叫資料來源的 SaveChanges 方法時,可以套用自訂驗證規則。這種驗證以獨佔方式執行於伺服器層。
若要在儲存資料時套用執行的驗證規則
在 [方案總管] 中,按兩下您要套用驗證規則的實體或資料表。
在 [資料設計工具] 的命令列中,按一下 [撰寫程式碼] 按鈕旁邊的箭號,然後按一下實體或資料表名稱[_Validate]。
[程式碼編輯器] 隨即開啟,並產生名為實體或資料表名稱[_Validate] 的方法。
將自訂驗證程式碼加入到 實體或資料表名稱[_Validate] 方法。
呼叫 results 參數的 AddEntityError 方法。
下列範例會在使用者儲存銷售訂單時檢查客戶的信用狀態。如果融資部門尚未核准客戶的信用,則擲回 ValidationException例外。
Private Sub Orders_Validate _ (entity As Order, results As _ Microsoft.LightSwitch.EntitySetValidationResultsBuilder) If Not CustomerCreditApproval(entity.Customer) Then results.AddEntityError("Customer Credit has not yet been approved") End If End Sub Private Function CustomerCreditApproval(ByVal entity As Customer) As Boolean 'Some custom code to check the customer’s credit status. Return True End Function
partial void Orders_Validate (Order entity, EntitySetValidationResultsBuilder results) { if (!CustomerCreditApproval(entity.Customer)) { results.AddEntityError ("Customer Credit has not yet been approved"); } } private bool CustomerCreditApproval(Customer entity) { //Some custom code to check the customer's credit status. return true; }
注意事項 根據預設,在擲回例外狀況時,會顯示錯誤訊息,而且資料會保留在目前的變更集。如果您要變更此行為,可以在您的程式碼處理 ValidationException。