首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fubumvc使用IFailureValidationPolicy进行简单的表单验证

fubumvc使用IFailureValidationPolicy进行简单的表单验证
EN

Stack Overflow用户
提问于 2012-01-14 03:50:27
回答 1查看 314关注 0票数 1

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

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

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

代码语言:javascript
复制
this.Validation(x => {
                            x.Actions
                                .Include(call => call.HasInput && call.InputType().Name.EndsWith("Input"));

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

下面是实现该策略的类:

代码语言:javascript
复制
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 ){ ....}

我是走在正轨上了吗,还是有什么根本的东西我没有理解?也许政策不是这里应该做的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-14 04:05:17

@stantona

政策机制将在这里发挥作用。我将省去我计划如何(很快)简化这项工作的详细信息,并注意到您使用FubuContinuation.TransferTo只是创建了一个FubuContinuation --它不会执行它。

这是你需要的:

代码语言:javascript
复制
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();
}
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8856390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档