2010-03-15 8 views
6

Po prostu zaczynam od ASP.NET MVC 2 i bawię się z Validation.Jak sprawdzać poprawność dwóch właściwości za pomocą ASP.NET MVC 2

Powiedzmy mam 2 właściwości:

  • hasło1
  • hasło2

I chcę wymagają, aby oba są wypełnione, i wymaga, że ​​oba są takie same przed modelu jest ważna.

Mam prostą klasę o nazwie "NewUser".

W jaki sposób mogę to wdrożyć? Czytałem o ValidationAttribute i rozumiem to. Ale nie widzę, w jaki sposób użyłbym tego do wdrożenia walidacji porównującej dwie lub więcej właściwości przeciwko jedzącemu.

Z góry dziękuję!

Problem z poniższej rozwiązania:

Gdy ta stosowana jest do aplikacji, a ModelBinder uruchamia walidacji modelu, to nie jest problem:

Jeśli Właściwość ValidationAttribute zawiera błąd, a następnie klasa klasy ValidationAttribute klasy to NOT zatwierdzono. Na razie nie znalazłem rozwiązania tego problemu.

Jeśli masz rozwiązanie tego problemu, podziel się swoim doświadczeniem. Wielkie dzięki!

Odpowiedz

7

Domyślny szablon programu ASP.NET MVC 2 programu Visual Studio zawiera wymagany dokładny atrybut sprawdzania poprawności. Wklejony z AccountModels.cs pliku:

[AttributeUsage(AttributeTargets.Class, 
    AllowMultiple = true, Inherited = true)] 
public sealed class PropertiesMustMatchAttribute : ValidationAttribute { 
    private const string _defaultErrorMessage = 
     "'{0}' and '{1}' do not match."; 
    private readonly object _typeId = new object(); 

    public PropertiesMustMatchAttribute(string originalProperty, 
     string confirmProperty) 
     : base(_defaultErrorMessage) { 
     OriginalProperty = originalProperty; 
     ConfirmProperty = confirmProperty; 
    } 

    public string ConfirmProperty { get; private set; } 
    public string OriginalProperty { get; private set; } 

    public override object TypeId { 
     get { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      OriginalProperty, ConfirmProperty); 
    } 

    public override bool IsValid(object value) { 
     PropertyDescriptorCollection properties = 
      TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, 
      true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, 
      true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
    } 
} 

Jak używać:

[PropertiesMustMatch("Password", "ConfirmPassword", 
    ErrorMessage = "The password and confirmation password do not match.")] 
class NewUser { 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Password")] 
    public string Password { get; set; } 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Confirm password")] 
    public string ConfirmPassword { get; set; } 
} 
+1

Jedyny problem widzę z tym jest, gdy dwie właściwości modelu (klasa w tym przypadku), nie są sobie równe, nie oznacza to specyficznych właściwości jako zawierających błędy, jak to ma miejsce w przypadku [Wymagane] i <% = Html.ValidationMessageFor (m => m.Password1)%> – CodeMonkey

+0

@CodeMonkey, widzę. Chociaż nie jestem pewien, czy istnieje eleganckie rozwiązanie, które sprawi, że będzie działać w inny sposób, przy użyciu wiązania modelu. W końcu technicznie jest to walidacja na poziomie klasy. Jeśli ** musisz ** dodać błędy do właściwości zamiast, to może sprawdzając dwie wartości w kontrolerze po tym, jak wiązanie będzie najszybszym rozwiązaniem (choć nie najbardziej eleganckim). –

+0

W wersji MVC 2 metoda pomocnika Html.ValidationSummary może teraz wyświetlać tylko błędy na poziomie modelu – murki

Powiązane problemy