2011-06-29 10 views
6

Na przykład mam model widoku pracownika. Tworząc pracownika, chcę zweryfikować nazwę użytkownika, aby upewnić się, że nie istnieje.Tworzenie sprawdzania poprawności adnotacji danych w MVC 3

public class EmployeeViewModel 
{ 
    [ScaffoldColumn(false)] 
    public int EmployeeId { get; set; } 

    [ValidateDuplicate(ErrorMessage = "That username already exists")] 
    [Required(ErrorMessage = "Username is required")] 
    [DisplayName("Username")] 
    public string Username { get; set; } 
} 

A następnie mieć funkcję ValidateDuplicate gdzieś z kodem, aby sprawdzić duplikat.

Czy to możliwe?

Odpowiedz

14

Proponuję przejrzeć remote validation. Przykład nawet pasuje do Twojego przypadku.

Zasadniczo dodać zdalny atrybut nieruchomości ViewModel wskazujący na działania kontrolera

[Remote("IsUserExists", "Account", ErrorMessage = "Can't add what already exists!")] 
[Required(ErrorMessage = "Username is required")] 
[DisplayName("Username")] 
public string Username { get; set; } 

który robi swoją pracę

public ActionResult IsUserExists(string userName) 
{ 
if (!UserService.UserNameExists(userName) || (CurrentUser.UserName == userName)) 
{ 
     return "Ok."; 
} 
} 
+2

To bingo! – Steven

+0

Link jest uszkodzony – sohtimsso1970

+1

David Hayden zmigrował swojego bloga w inne miejsce i wydaje się, że nie odesłał swoich starych postów na blogu (lub nie mógł). Powiedziawszy, tutaj jest link bezpośrednio do dokumentacji Microsoft: http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx – Khepri

0

Możesz to zrobić, rozszerzając klasę Atrybut nazywając ją ValidateDuplicate. Unikałbym robienia tego w ten sposób, ponieważ jest to kolejne miejsce, w którym potencjalnie musisz wykonać połączenie z bazą danych.

2

Możesz napisać własną niestandardową weryfikację zgodnie z wyjaśnieniami here. Zmodyfikowałem kod, aby dodać sprawdzanie poprawności w modelu, ponieważ preferuję styl sprawdzania poprawności aktywnego protokołu w modelu.

public class EmployeeViewModel 
{ 

    [CustomValidation(typeof(EmployeeViewModel), "ValidateDuplicate")] 
    [Required(ErrorMessage = "Username is required")] 
    [DisplayName("Username")] 
    public string Username { get; set; } 

    public static ValidationResult ValidateDuplicate(string username) 
    { 
     bool isValid; 

     using(var db = new YourContextName) { 
     if(db.EmployeeViewModel.Where(e => e.Username.Equals(username)).Count() > 0) 
     { 
      isValid = false; 
     } else { 
      isValid = true; 
     } 
     } 

     if (isValid) 
     { 
     return ValidationResult.Success; 
     } 
     else 
     { 
     return new ValidationResult("Username already exists"); 
     } 

    } 
} 
Powiązane problemy