Procedura: convalidare i dati
In questo argomento viene descritto come si aggiungono gli attributi di convalida a proprietà ed entità per applicare le regole di convalida. In WCF RIA Services vengono forniti diversi attributi di convalida che eseguono controlli di convalida comuni e viene fornito anche l'attributo CustomValidationAttribute per consentire di specificare controlli di convalida personalizzati.
I seguenti attributi di convalida predefiniti sono forniti da RIA Services :
Gli attributi di convalida si aggiungono alle entità nel progetto server e vengono propagati alle rappresentazioni delle entità client generate. Durante il runtime, le regole di convalida vengono applicate ai dati dall'utente. È necessario aggiungere le classi di metadati per aggiungere gli attributi di convalida. Per ulteriori informazioni su questa procedura, vedere Procedura: aggiungere classi di metadati.
In questo argomento viene descritto come aggiungere gli attributi di convalida personalizzati e predefiniti.
Per aggiungere attributi di convalida forniti da Servizi RIA
Aggiungere una classe di metadati per la classe di entità, come descritto in Procedura: aggiungere classi di metadati.
Per le proprietà o le entità che si desidera convalidare, aggiungere gli attributi di convalida che eseguono la convalida.
Nell'esempio seguente vengono illustrati gli attributi RequiredAttribute e StringLengthAttribute applicati a una proprietà denominata
AddressLine1
.<Required()> _ <StringLength(60)> _ <RoundtripOriginal()> _ Public AddressLine1 As String
[Required] [StringLength(60)] [RoundtripOriginal] public string AddressLine1 { get; set; }
Compilare la soluzione (CTRL+MAIUSC+B).
Nell'applicazione Silverlight, aprire il file di codice generato nella cartella Generated_Code e notare come gli attributi di convalida siano stati applicati nel codice client.
Per aggiungere un attributo di convalida personalizzato
Aggiungere una classe di metadati per la classe di entità, come descritto in Procedura: aggiungere classi di metadati.
Aggiungere un file di codice condiviso utilizzando il modello di denominazione
*.shared.cs
o*.shared.vb
.Il file di codice conterrà l'oggetto di convalida personalizzato.
Aggiungere un metodo che determina se i dati sono validi.
Il metodo deve essere public e static (o Public e Shared in Visual Basic). Deve restituire un elemento ValidationResult per indicare il risultato del controllo di convalida. Quando si definisce la classe di convalida personalizzata, è necessario fornire almeno un codice diverso dalle proprietà implementate automaticamente affinché la classe venga generata correttamente nel progetto client.
Nell'esempio seguente viene illustrata una classe denominata
ProductValidator
con un metodo denominatoIsProductValid
che convalida un'entità Product. Quando i dati non sono validi, viene restituito il messaggio di errore e il nome della proprietà non convalidata.Imports System.ComponentModel.DataAnnotations Public Class ProductValidator Public Shared Function IsProductValid(ByVal productToValidate As Product, ByVal context As ValidationContext) If (productToValidate.ListPrice < (CDec(0.8) * productToValidate.StandardCost)) Then Return New ValidationResult("ListPrice is below 80 percent of StandardCost.", New String() {"ListPrice"}) Else Return ValidationResult.Success End If End Function End Class
using System; using System.ComponentModel.DataAnnotations; namespace RIAServicesExample.Web { public class ProductValidator { public static ValidationResult IsProductValid(Product productToValidate, ValidationContext context) { if (productToValidate.ListPrice < ((decimal).8 * productToValidate.StandardCost)) { return new ValidationResult("ListPrice is below 80 percent of StandardCost.", new string[] { "ListPrice" }); } else { return ValidationResult.Success; } } } }
Per l'entità o la proprietà che si desidera convalidare, aggiungere l'attributo CustomValidationAttribute e passare il tipo dell'oggetto di convalida e il nome del metodo che esegue la convalida.
Nell'esempio riportato di seguito viene illustrata l'applicazione dell'attributo CustomValidationAttribute a un'entità. Il tipo di oggetto di convalida è
ProductValidator
e il metodo èIsProductValid
.<CustomValidation(GetType(ProductValidator), "IsProductValid")> _ <MetadataTypeAttribute(GetType(Product.ProductMetadata))> _ Partial Public Class Product Friend NotInheritable Class ProductMetadata 'Metadata classes are not meant to be instantiated. Private Sub New() MyBase.New() End Sub Public Color As String Public DiscontinuedDate As Nullable(Of DateTime) Public ListPrice As Decimal Public ModifiedDate As DateTime Public Name As String Public ProductCategoryID As Nullable(Of Integer) Public ProductID As Integer Public ProductModelID As Nullable(Of Integer) Public ProductNumber As String Public rowguid As Guid Public SellEndDate As Nullable(Of DateTime) Public SellStartDate As DateTime <Required()> _ <StringLength(20)> _ Public Size As String Public StandardCost As Decimal Public ThumbNailPhoto() As Byte Public ThumbnailPhotoFileName As String Public Weight As Nullable(Of Decimal) End Class End Class
[CustomValidation(typeof(ProductValidator), "IsProductValid")] [MetadataTypeAttribute(typeof(Product.ProductMetadata))] public partial class Product { internal sealed class ProductMetadata { // Metadata classes are not meant to be instantiated. private ProductMetadata() { } public string Color; public Nullable<DateTime> DiscontinuedDate; public decimal ListPrice; public DateTime ModifiedDate; public string Name; public Nullable<int> ProductCategoryID; public int ProductID; public Nullable<int> ProductModelID; public string ProductNumber; public Guid rowguid; public Nullable<DateTime> SellEndDate; public DateTime SellStartDate; [Required()] [StringLength(20)] public string Size; public decimal StandardCost; public byte[] ThumbNailPhoto; public string ThumbnailPhotoFileName; public Nullable<decimal> Weight; } }
Compilare la soluzione (CTRL+MAIUSC+B).
Nell'applicazione Silverlight, aprire la cartella Generated_Code. Notare che il file di codice condiviso è presente nella cartella e che CustomValidationAttribute è stato applicato all'entità.