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