Проверка комплексного класса в MVC - PullRequest
2 голосов
/ 14 марта 2012

Рассмотрим следующий код:

public class AccountNumber
{
    [AccountNumber] //This validator confirms the format of the account number 
    public string Value {get; set;}

    public int Format { get; set;}

    public string ToString() 
    {
        return Value + " is format " + Format;
    }
}

public class MyViewModel
{
     public MyViewModel()
     {
          SourceAccount = new AccountNumber();
          DestinationAccount= new AccountNumber();
     }

     [Required]
     AccountNumber SourceAccount {get; set;}

     AccountNumber DestinationAccount {get; set;} 
}

А потом, в моем представлении:

@Html.EditorFor(model => model.SourceAccount.Value)
@Html.EditorFor(model => model.DestinationAccount.Value)

По сути, я хочу сказать, что пользователь должен ввестиисходную учетную запись, и что они дополнительно вводят целевую учетную запись.Тем не менее, если они действительно войдут в учетную запись назначения, она должна соответствовать определенному формату.

Проблема с кодом выше состоит в том, что требуемый валидатор на SourceAccount всегда будет возвращать действительный, поскольку SourceAccountникогда не бывает нулевымКакой будет хороший подход для реализации того, что я пытаюсь достичь?

Обратите внимание, что в реальной жизни установщик для Value является более сложным, чем показано, поскольку он переформатирует номер счета в каноническом формате..

Редактировать Обратите внимание, что мы должны использовать встроенную проверку MVC, поскольку это то, что в настоящее время использует остальная часть проекта.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

См. Расширение связывателя модели для расширенной проверки .
Это полностью совместимо со встроенной проверкой MVC.

Вы можете - конечно - настроить это решение, используя собственный интерфейс для проверки.

1 голос
/ 15 марта 2012

Простым подходом может быть добавление простых строковых свойств для номеров SourceAccount и DestinationAccount следующим образом:

public class MyViewModel
{
    public MyViewModel()
    {
    }

    [Required]
    [AccountNumber]
    public string SourceAccountNumber { get; set; }

    [AccountNumber]
    public string DestinationAccountNumber { get; set; }

    public AccountNumber SourceAccount
    {
        get
        {
            return new AccountNumber
            {
                Value = SourceAccountNumber,
                Format = 0 // Set Format appropriately
            };
        }
    }

    public AccountNumber DestinationAccount
    {
        get
        {
            return new AccountNumber
            {
                Value = DestinationAccountNumber,
                Format = 0 // Set Format appropriately
            };
        }
    }
}
0 голосов
/ 14 марта 2012

Возможно, вы захотите попробовать FluentValidation , это альтернатива проверки модели атрибутам аннотации данных, которая позволяет вам добавлять более сложную логику проверки модели.

Код по-прежнему довольно лаконичен и прост:

[Validator(typeof(PersonValidator))]
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
}

public class PersonValidator : AbstractValidator<Person>
{
    public PersonValidator()
    {
        RuleFor(x => x.Id).NotNull();
        RuleFor(x => x.Name).Length(0, 10);
        RuleFor(x => x.Email).EmailAddress();
        RuleFor(x => x.Age).InclusiveBetween(18, 60);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...