5

W części naszej logiki potrzebujemy do iteracji właściwości modelu do właściwości automatycznego wiązania i chcemy rozszerzyć funkcjonalność o nowe dane w C# 4.0.Jak ręcznie wywołać atrybuty sprawdzania poprawności? (DataAnnotations i ModelState)

W tej chwili zasadniczo iteruję po każdym ładowaniu właściwości we wszystkich instancjach ValidationAttribute i próbuję sprawdzić poprawność za pomocą funkcji Validate/IsValid, ale to nie działa dla mnie.

Jako przykład mam modelu, takie jak:

public class HobbyModel 
{ 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Do not allow empty strings")] 
    [DisplayName("Hobby")] 
    [DataType(DataType.Text)] 
    public string Hobby 
    { 
     get; 
     set; 
    } 
} 

a kod do sprawdzenia atrybuty to:

object[] attributes = propertyInfo.GetCustomAttributes(true); 
TypeConverter typeConverter = 
TypeDescriptor.GetConverter(typeof(ValidationAttribute)); 

bool isValid = false; 
foreach (object attr in attributes) 
{ 
    ValidationAttribute attrib = attr as ValidationAttribute; 

    if (attrib != null) 
    { 
    attrib.Validate(obj, propertyInfo.Name); 
    } 
} 

Mam debugowania kodu, a model ma 3 cechy , 2 z których pochodzą z ValidationAttribute, ale kiedy kod przechodzi przez funkcję Validate (z pustą lub pustą wartością), generuje wyjątek zgodnie z oczekiwaniami.

Spodziewam się, że robię coś głupiego, więc zastanawiam się, czy ktoś użył tej funkcji i może pomóc.

Dzięki z góry, Jamie

Odpowiedz

3

Dzieje się tak, ponieważ przekazujesz obiekt źródłowy do metody Validate zamiast wartości właściwości. Poniżej bardziej prawdopodobne, aby działać zgodnie z oczekiwaniami (choć oczywiście nie na właściwości indeksowanych):

attrib.Validate(propertyInfo.GetValue(obj, null), propertyInfo.Name); 

pewno będziesz mieć łatwiej using the Validator class jak Steven suggested, choć.

4

używasz klasę System.ComponentModel.DataAnnotations.Validator do sprawdzania obiektów.

+0

Masz przykład użycia DataAnnotations 4.0 z ASP.Net MVC 3.0, obecnie używam 3.5 (który może lub nie działa, uaktualniam kod z MVC 1.0 na 3) – Jamie

+0

Jeśli nie jestem mylnie, MVC 2 i nowsze działają domyślnie z DataAnnotations, więc podczas pracy z MVC 3 nie będziesz musiał wywoływać walidatora ręcznie. – Steven

+0

Zasadniczo chcemy odciążyć proces w oddzielny mechanizm, więc chcemy mieć możliwość automatycznego sprawdzania i ręcznego sprawdzania poprawności. – Jamie

Powiązane problemy