我在 MVC 3 中使用流畅验证。是否可以关闭控制器中特定后期操作的流畅验证?
谢谢
假设您正在使用AttributedValidatorFactory
并且您想禁用对 Home 控制器上的 Index 操作的验证 POST 动词,您可以编写一个自定义验证器工厂:
public class MyAttributedValidatorFactory : AttributedValidatorFactory
{
private readonly Func<HttpContextBase> _contextAccessor;
public MyAttributedValidatorFactory(Func<HttpContextBase> contextAccessor)
{
_contextAccessor = contextAccessor;
}
public override IValidator GetValidator(Type type)
{
var context = _contextAccessor();
var rd = context.Request.RequestContext.RouteData;
var action = rd.GetRequiredString("action");
var controller = rd.GetRequiredString("controller");
if (string.Equals("post", context.Request.HttpMethod, StringComparison.OrdinalIgnoreCase) &&
string.Equals("index", action, StringComparison.OrdinalIgnoreCase) &&
string.Equals("home", controller, StringComparison.OrdinalIgnoreCase)
)
if (type == typeof(MyViewModel))
{
return null;
}
return base.GetValidator(type);
}
}
它将用于替换您的默认值Application_Start
:
FluentValidationModelValidatorProvider.Configure(config =>
{
Func<HttpContextBase> contextAccessor =
() => new HttpContextWrapper(HttpContext.Current);
config.ValidatorFactory = new MyAttributedValidatorFactory(contextAccessor);
});
然后如果您在 Home 控制器上有以下操作:
[HttpPost]
public ActionResult Index(MyViewModel model)
{
...
}
FluentValidation 不会启动。
你错过了一些重要的 fluentvalidation 点,称为 Validator 定制。
在这里找到http://fluentvalidation.codeplex.com/wikipage?title=mvc
验证器定制
使用 FluentValidation v3,您可以使用 CustomizeValidatorAttribute 来配置验证器的运行方式。例如,如果您希望验证器仅针对特定规则集运行,那么您可以通过指定要验证的参数来指定该规则集名称:
public ActionResult Save([CustomizeValidator(RuleSet="MyRuleset")] Customer cust) {
// ...
}
这个