Asp.net fubumvc-使用IFailureValidationPolicy的简单表单验证

Asp.net fubumvc-使用IFailureValidationPolicy的简单表单验证,asp.net,fubumvc,Asp.net,Fubumvc,我一直在努力正确地实现表单验证,关于fubu邮件列表的讨论是最有帮助的()。 在某些方面我还不完全清楚,我是一个新手,所以我正在经历一些牦牛剃须 讨论中给出的示例似乎使用IsValid(model)在控制器内部执行了验证 我试图通过使用诸如Required之类的验证属性装饰输入模型,然后使用验证配置在失败时传输(通过策略)来避免这种情况 Handle只是尝试通过一个新模型转移到另一个操作,将值复制到新模型中,以便我可以在表单上再次显示它们 我一定是做错了什么,因为它不会转移到任何地方。 我有一个

我一直在努力正确地实现表单验证,关于fubu邮件列表的讨论是最有帮助的()。 在某些方面我还不完全清楚,我是一个新手,所以我正在经历一些牦牛剃须

讨论中给出的示例似乎使用IsValid(model)在控制器内部执行了验证

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

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

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

public AccountViewModel新建(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();
}
}
@斯坦托纳

政策机制将在这里发挥作用。我将向您详细介绍我计划如何(很快)简化此过程,并注意您使用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();
}
}

谢谢,那是我丢失的一块。我想确认这是否是此类验证场景的最佳实践?我关心的是,我必须将RegistrationFailedNotification模型中的细节映射到操作中的视图模型。对我来说似乎有点冗长,但接下来我仍然会接受一些基本概念。我在这里详细介绍一下:但这里有一个我所想的示例:public RegisterAccountModel Get(RegisterAccountModel model){//如果需要做其他事情,请返回model;}public FubuContinuation Post(RegisterAccountModel模型){//只有在验证通过并返回FubuContinuation.Redirect…}时才会调用此函数。确定,因此代码格式在注释中不起作用。但这就是我的想法——保持你的模型对称,一切都变得简单多了。酷,这就是我处理事情的方式,使用对称模型和automapper在它们之间进行映射。如果框架能够自动完成这项工作,那就太好了,也就是说,当您请求继续时,可以选择使用从输入模型映射的属性创建新模型。我只是想了想,不知道这是不是一个常见的场景。谢谢,这是我丢失的一部分。我想确认这是否是此类验证场景的最佳实践?我关心的是,我必须将RegistrationFailedNotification模型中的细节映射到操作中的视图模型。对我来说似乎有点冗长,但接下来我仍然会接受一些基本概念。我在这里详细介绍一下:但这里有一个我所想的示例:public RegisterAccountModel Get(RegisterAccountModel model){//如果需要做其他事情,请返回model;}public FubuContinuation Post(RegisterAccountModel模型){//只有在验证通过并返回FubuContinuation.Redirect…}时才会调用此函数。确定,因此代码格式在注释中不起作用。但这就是我的想法——保持你的模型对称,一切都变得简单多了。酷,这就是我处理事情的方式,使用对称模型和automapper在它们之间进行映射。如果框架能够自动完成这项工作,那就太好了,也就是说,当您请求继续时,可以选择使用从输入模型映射的属性创建新模型。我只是想了想,不知道这是不是一个常见的情况。
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();
}
}