我正在尝试为 FluentValidation 构建一个通用的远程验证器扩展,类似于此线程中讨论的内容。此博客中发布了客户端解决方案,但我需要远程验证器同时在客户端和服务器端工作。
规则看起来像这样:
IRuleBuilderOptions<T, TProperty> Remote(string action,
string controller,
Expression<Func<T, object>>[] properties,
IComparable[] values,
HttpVerbs httpVerb = HttpVerbs.Get);
其中:
action
andcontroller
是动作/控制器的名称
properties
是模型属性表达式的数组 (m => m.FirstName)
values
是文字值的数组
为验证器设置规则可能如下所示:
this.RuleFor(m => m.Username).Remote("UsernameUnique", "RemoteController", null, null);
我想我可以弄清楚客户端部分,因为我将构建一个 jQuery 适配器来调用操作方法,并传入值。
我不知道如何从IsValid
验证器的方法中调用相同的控制器操作。
以下是我考虑过的一些选项:
以某种方式远程调用控制器操作,创建存根上下文。不确定如何使用 IoC 注入依赖项。服务定位器?
使用普通的 .NET 方法,并从验证器和操作方法中调用它。
我认为这将是一个强大的验证器,但似乎我想出的任何选项都将是丑陋的,即使我设法让它工作。
有没有更好的方法来解决这个问题?我对任何可行的方法都持开放态度,只是找不到很多选择,至少没有优雅的选择。但是在这一点上,如果没有其他选择,我什至可以接受一个非优雅的解决方案。