fubumvc - 使用IFailureValidationPolicy进行简单表单验证

时间:2012-01-13 19:50:27

标签: asp.net fubumvc

我一直在尝试正确实现表单验证,对fubu邮件列表的讨论最有帮助(http://groups.google.com/group/fubumvc-devel/browse_thread/thread/d54b135fe0254653/12180cd86e9dc50b)。 我在某些方面还不是很清楚,我是新手,所以我正在经历一些牦牛剃须。

似乎讨论中给出的示例使用IsValid(模型)在控制器本身内执行了验证。

我试图通过使用必需的验证属性来修饰我的输入模型来避免这种情况,然后使用验证配置在失败时转移(通过策略)。

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 notification){   .... }

我是在这里,还是有一些基本的东西,我没有得到?也许政策不是在这里做的事情?

1 个答案:

答案 0 :(得分:4)

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