Создание пользовательской проверки аннотации данных в MVC 3 - PullRequest
7 голосов
/ 30 июня 2011

Например, у меня есть модель представления Employee.При создании сотрудника я хочу проверить имя пользователя, чтобы убедиться, что оно не существует.

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; }
}

А затем где-нибудь с моей функцией ValidateDuplicate с кодом для проверки на дубликат.

Возможно ли это?

Ответы [ 4 ]

15 голосов
/ 30 июня 2011

Я бы посоветовал посмотреть на удаленную проверку. Пример даже соответствует вашему случаю.

В основном, добавьте атрибут remote к свойству viewmodel, который указывает на действие контроллера

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

которая делает вашу работу

public ActionResult IsUserExists(string userName) 
{
 if (!UserService.UserNameExists(userName) || (CurrentUser.UserName == userName))
 {
      return "Ok.";
 }
}
2 голосов
/ 20 мая 2012

Вы можете написать свою собственную пользовательскую проверку, как объяснено здесь . Я изменил код для добавления проверки в модель, так как я предпочитаю стиль проверки активной записи rails в модели.

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");
      }

    }
}
2 голосов
/ 30 июня 2011
0 голосов
/ 30 июня 2011

Вы можете сделать это, расширив класс Attribute, назвав его ValidateDuplicate. Я бы не стал делать это таким образом, потому что это просто еще одно место, где вам, возможно, придется позвонить в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...