我一直在尝试正确地实现表单验证,在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只是尝试通过一个新模型转移到另一个操作,将值复制到新模型中,这样我就可以在表单上再次显示它们。
我一定是做错了什么,因为它不能传输到任何地方。我有一个带有这个方法的类,我希望它能处理它。
公共通知新建(RegisterationFailedNotification AccountViewModel ){ ....}
我是走在正轨上了吗,还是有什么根本的东西我没有理解?也许政策不是这里应该做的事情?
发布于 2012-01-14 04:05:17
@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();
}
}https://stackoverflow.com/questions/8856390
复制相似问题