如何:验证数据

您可以将“验证规则”应用于实体或表,以确保将格式正确的数据写入数据源。 有效性规则是您应用程序中的数据必须遵守的条件或约束。 您可以将一个或多个有效性规则添加到 LightSwitch 中的实体或表中。 如果用户添加或更改数据,并且该数据不符合有效性规则,则 LightSwitch 显示错误。 用户可以提交数据之前,必须先修复验证错误。

下面的插图显示验证错误消息。

验证错误消息

LightSwitch 包括几种内置的验证规则。 您可以配置这些规则,并将它们应用于实体或表而无需编写任何代码。 您还可以使用代码来定义自定义验证规则。

本主题包含以下各节:

  • 向字段应用预定义验证规则

  • 向字段应用自定义验证规则

  • 向屏幕中的数据应用自定义验证规则

  • 应用保存数据时运行的验证规则

链接到视频 有关相关视频演示,请参见 How Do I: Write business rules for validation and calculated fields in a LightSwitch Application?(如何实现:在 LightSwitch 应用程序中未验证和计算字段编写业务规则)

向字段应用预定义验证规则

LightSwitch 包括几种内置的验证规则,您可以使用该规则而无需编写任何自定义的代码。 您可以各个数据字段或用户对屏幕中的数据进行的任何类型的更新应用这些规则。

向字段应用预定义验证规则

  1. 在**“解决方案资源管理器”**中,双击要对其应用验证规则的实体或表。

    在**“数据设计器”**中打开实体或表格。

  2. 在**“数据设计器”**中,选择您要验证的字段。

  3. 在**“属性”窗口中,在“验证”**部分中设置任何属性的值。

    有关验证属性的信息,请参见 参考:数据设计器属性

向字段应用自定义验证规则

您可以通过编写代码定义自定义验证规则。 您可以指定何时由 LightSwitch 执行这些验证规则。 例如,您可以指定字段的验证规则在用户键入一个值后立即执行。 或者,您可以指定一个实体或表仅在其所有字段都包含一个值后才接受评估。 当一个字段中的值的有效性依赖于相同实体或表中另一个字段的有效值时,这种模式是合理的。

将自定义验证规则应用于字段

  1. 在**“解决方案资源管理器”**中,双击要对其应用验证规则的实体或表。

    在**“数据设计器”**中打开实体或表格。

  2. 在**“数据设计器”**中,选择您要验证的字段。

  3. 在**“属性”窗口中,单击“自定义验证”**。

    **“代码编辑器”**可打开并生成一个名为字段名的 [_Validate] 方法。

  4. 将验证代码添加到文件名 [_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]方法。 您的自定义代码在用户修改屏幕中的任何数据(例如,添加或删除数据)时运行。 在可以保存数据之前运行这些规则。

向屏幕中的数据应用自定义验证规则

  1. 在**“解决方案资源管理器”**中,双击要为其指定验证规则的屏幕。

  2. 在**“屏幕设计器”顶部,单击“编写代码”**。

    “代码编辑器”将打开。

  3. 在**“声明”**菜单上,选择<实体或表名称>[_Validate]。

    名为<实体或表名称>[_Validate]的代码块出现在代码文件中。

  4. 将您的自定义验证代码添加到<实体或表名称>[_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方法时,您可以应用自定义验证规则。 这种验证以独占方式在服务器层运行。

应用保存数据时运行的验证规则

  1. 在**“解决方案资源管理器”**中,双击要对其应用验证规则的实体或表。

  2. 在**“数据设计器”** 的命令栏中,单击**“编写代码”** 按钮旁边的箭头,然后单击实体或表名称[_Validate]。

    **“代码编辑器”**打开并生成一个名为实体或表名的 [_Validate] 方法。

  3. 将您的自定义验证代码添加到实体或表名称[_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。

请参见

任务

如何:处理数据事件

如何:定义数据字段

概念

使用代码执行与数据相关的任务

在代码中使用与数据相关的对象

在 LightSwitch 中编写代码

其他资源

Overview of Data Validation in LightSwitch Applications(LightSwitch 应用程序中的数据验证概述)

数据:应用程序背后的信息