使用IFailureValidationPolicy的简单表单验证



我一直在努力正确地实现表单验证,关于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);
    }
}

Handle只是尝试通过一个新模型转移到另一个操作,将值复制到新模型中,这样我就可以在表单上再次显示它们

我一定在这里做错了什么,因为它没有转移到任何地方。我有一个用这种方法的类,我希望它能处理它

public AccountViewModel New(RegisterationFailedNotification通知){。。。。}

我在这里走上正轨了吗,还是有一些根本的东西我没有得到?也许这里不适合制定政策?

@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();
}
}

最新更新