fubumvc - простая проверка форм с использованием IFailureValidationPolicy - PullRequest
1 голос
/ 13 января 2012

Я пытался правильно реализовать проверку формы, и обсуждение списка рассылки fubu было наиболее полезным (http://groups.google.com/group/fubumvc-devel/browse_thread/thread/d54b135fe0254653/12180cd86e9dc50b).. Я до сих пор не совсем уверен в некоторых моментах, я новичок, поэтому яПрохожу через некоторое бритье яков.

Кажется, что пример, приведенный в обсуждении, выполнил проверку в самом контроллере с использованием IsValid (модель).

Я пытаюсь избежать этогоукрасить мою входную модель атрибутами проверки, такими как Required, и затем использовать конфигурацию проверки для передачи при сбое (через политику).

this.Validation(x => {
                            x.Actions
                                .Include(call => call.HasInput && call.InputType().Name.EndsWith("Input"));

                            x.Failures                                    
                                .ApplyPolicy<AccountValidationFailedPolicy>();
                        });

А вот класс, который влияет на политику:

public class AccountValidationFailedPolicy : IValidationFailurePolicy {

    public bool Matches(ValidationFailure context) {
        return (context.InputType() == typeof (RegisterAccountInput));
    }

    public void Handle(ValidationFailure context) {
        var incomingRequest = (RegisterAccountInput) context.InputModel;

        var failedValidation = new RegisterationFailedNotification {
            CVV = incomingRequest.CVV,
            AcceptTerms = incomingRequest.AcceptTerms,
            Countries = incomingRequest.Countries,
            PhoneNumber = incomingRequest.PhoneNumber,
            PIN = incomingRequest.PIN
        };

        FubuContinuation.TransferTo(failedValidation);
    }
}

Ручка просто пытается перейти к другому действию через новую модель, копируя значения в новую модель, чтобы я мог снова отобразить их в форме.

Я, должно быть, здесь что-то делаю не так, потому что этоУ меня нет класса с этим методом, который я надеялся бы обработать.

public AccountViewModel New (Уведомление RegistivationFailedNotification) {....}

Я здесь на пути или есть что-то фундаментальное, чего я не получаю?Возможно, политика здесь не то, что нужно делать?

1 Ответ

4 голосов
/ 14 января 2012

@ stantona

Механизм политики будет работать здесь.Я избавлю вас от подробностей о том, как я планирую сделать это проще (очень скоро), и отмечу, что ваше использование FubuContinuation.TransferTo просто создает FubuContinuation - он не выполняет его.

Вот что вам нужно:

public class AccountValidationFailedPolicy : IValidationFailurePolicy {
private readonly IFubuRequest _request;
private readonly IValidationContinuationHandler _handler;

public AccountValidationFailedPolicy(IFubuRequest request, IValidationContinuationHandler handler) {
    _request = request;
    _handler = handler;
}

public bool Matches(ValidationFailure context) {
    return (context.InputType() == typeof (RegisterAccountInput));
}

public void Handle(ValidationFailure context) {
    var incomingRequest = (RegisterAccountInput) context.InputModel;

    var failedValidation = new RegisterationFailedNotification {
    CVV = incomingRequest.CVV,
    AcceptTerms = incomingRequest.AcceptTerms,
    Countries = incomingRequest.Countries,
    PhoneNumber = incomingRequest.PhoneNumber,
    PIN = incomingRequest.PIN
    };

    var continuation = FubuContinuation.TransferTo(failedValidation);
    _request.Set(continuation);

    _handler.Handle();
}
}
...