我正在使用 Foolproof Validation所以我可以在我的 View 模型上使用 [RequiredIf] 属性。问题是我想在我的代码中使用 Controller 外部的相同逻辑触发验证。
我尝试创建自己的验证上下文并使用 Validatior.TryValidateObject;然而,Foolproof 的自定义 RequiredIf 验证器失败了。除了将模型传递给 Controller 之外,还有其他方法可以获取我的模型并对其进行验证吗?
我是否使用了错误的方法?
这是我的代码:
var draftModel = _draftHelper.LoadDraft(draftId);
var validationResults = new List<ValidationResult>();
var vc = new ValidationContext(draftModel, null, null);
var isValidDraft = Validator.TryValidateObject(draftModel, vc,
validationResults, true);
我得到的错误是在 TryValidateObject 行
System.NotImplementedException: The method or operation is not implemented.
最佳答案
我认为更好的方法是使用 FluentValidation ,不是万无一失的验证。我个人认为 Fluent 也比属性更好 :)。
使用 FluentValidation,您还可以在不使用 Controller 的情况下验证您的模型。
DraftVM draft = draftRepository.Get(draftId);
var DraftValidator validator = new DraftVMValidator();
ValidationResult results = validator.Validate(draft);
public class DraftVMValidator : AbstractValidator<DraftViewModel>
{
public DraftVMValidator()
{
RuleFor(vm => vm.OptionalField)
.Must(BeFilledIfNameNotEmpty)
.WithMessage("Optional Field required because you filled out Name field");
}
public bool BeFilledIfNameNotEmpty(DraftVM viewModel)
{
return !string.IsNullOrWhiteSpace(viewModel.Name);
}
}
这不会给您一个 System.NotImplemented 异常。
此验证器是干式的,因为您也可以将其插入 ASP.NET MVC 验证。
您可以简单地在 Global.asax 或 App_Start 等中调用以下代码。一个验证器用于所有验证器,将其绑定(bind)到 MVC 模型验证或在任何普通应用程序中使用它。
FluentValidationModelValidatorProvider.Configure(); // This will bind it for you
如果您使用像 Ninject 这样的控制反转容器,FluentValidation 也有一个插件可以与之配合使用。在上面提供的链接中可以在他们的文档中获得更多信息。
如果您想查看此验证器而不是 FoolProof 的更多示例,我的 Github 中有一个非常大的项目示例。 Example Validators with ASP.NET MVC 4
关于asp.net-mvc - 手动触发万无一失的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16349928/