2

我有以下 DTO,为此我制定了一些验证规则:

[Route("/warranties/{Id}", "GET, PUT, DELETE")]
[Route("/warranties", "POST")]
public class WarrantyDto : IReturn<WarrantyDto>
{
    public int Id { get; set; }
    public int StatusId { get; set; }
    public string AccountNumber { get; set; }
}

验证规则:

public class WarrantyDtoValidator : AbstractValidator<WarrantyDto>
{
    public WarrantyDtoValidator()
    {
        RuleSet(ApplyTo.Post, () => RuleFor(x => x.AccountNumber).NotEmpty());

        RuleSet(ApplyTo.Put, () =>
        {
            RuleFor(x => x.Id).NotEmpty();
            RuleFor(x => x.AccountNumber).NotEmpty();
        });

        RuleSet(ApplyTo.Delete, () => RuleFor(x => x.Id).NotEmpty());
    }
}

在 AppHost 中设置验证:

Plugins.Add(new ValidationFeature());
container.RegisterValidators(typeof (WarrantyDtoValidator).Assembly);
FluentValidationModelValidatorProvider.Configure(provider =>
{
    provider.ValidatorFactory = new FunqValidatorFactory(container);
});

然后,当我发布 WarrantyDto 时,如果我不输入以下内容,验证似乎不起作用AccountNumber

[POST("create")]
public ActionResult Create(WarrantyDto model)
{
    if (!ModelState.IsValid) return View(model);

    _warrantyService.Post(model);
    return RedirectToAction("Index");
}

它似乎只是在_warrantyService.Post(model);没有尝试首先验证的情况下击中,有什么想法吗?

4

1 回答 1

3

我相信 ServiceStack 在它的请求/响应管道中处理了一些 FluentValidation RuleSet 处理。但是,在您的 MVC 控制器中,您必须处理传递要使用的规则集。您还应该研究如何执行不在 RuleSets 中的规则,因为 ServiceStack 执行规则的方式与“标准”FluentValidation 执行规则之间存在差异。

[POST("create")]
public ActionResult Create([CustomizeValidator(RuleSet = "POST")]WarrantyDto model)
{
    if (!ModelState.IsValid) return View(model);

    _warrantyService.Post(model);
    return RedirectToAction("Index");
}
于 2013-10-10T19:22:48.727 回答