FluentValidation在错误的时间进行验证

时间:2016-10-19 19:38:39

标签: asp.net-mvc fluentvalidation

我在MVC网站上设置了FluentValidation。我的一个对象有一个验证检查,它使用Must命令来调用一个函数:

RuleFor(m => m).Must(m => reimbursementMonthsRequired(m)).WithMessage("Wrong!").WithName("ReimbursementStartMonth");

reimbursementMonthsRequired函数检查对象上的值和对象下的集合以确定有效性。

我有一个Post方法接受用于更新该集合的值列表:

[HttpPost]
public ActionResult AddGrant(Grant item, List<byte> reimbursementMonths)
{
  item.UpdateReimbusementMonths(Database, reimbursementMonths);
  if (ModelState.IsValid)
  {     
    Database.Grants.Add(item);
    Database.SaveChanges();
    ...

我遇到的问题是,在此函数中,在调用UpdateReimbusementMonths之前调用验证检查。因此,我需要在那里进行验证检查才能正常工作的数据尚不存在。奇怪的是,在我的Edit函数中,验证发生在我调用UpdateReimbursementMonths之后,因此它可以正常工作。这是正在做的事情:

[HttpPost]
public ActionResult EditGrant(int id, List<byte> reimbursementMonths)
{
  var item = Database.Grants.Find(id);
  item.UpdateReimbusementMonths(Database, reimbursementMonths);
  TryUpdateModel(item);
  if (ModelState.IsValid)
  ... 

那么如何让我的Add函数在适当的时候进行验证 - 在函数调用之后更新集合?似乎如果我可以在该函数调用之后重新运行验证检查,那就可以了。

2 个答案:

答案 0 :(得分:0)

根据documentation

工作

在AddGrant方法中,您发布了Grant对象,因此在执行操作方法中的任何代码之前,它会在自动绑定后进行验证。

- &GT;在发布或删除流畅验证之前,您必须使用报销更新Grant,并在操作方法中手动执行此验证。

- &GT;另一个选择是编写自定义Validator Interceptors并使用BeforeMvcValidation方法更新Grant项目和Reimbursements。 (这可能是一个黑客而且不理想)

答案 1 :(得分:0)

我发现AddGrant方法可以执行与EditGrant类似的操作。而不是将Grant对象作为方法参数,我这样做了:

public ActionResult AddGrant(List<byte> reimbursementMonths)
{      
  var item = new Grant();
  item.UpdateReimbusementMonths(Database, reimbursementMonths);
  TryUpdateModel(item);

  if (ModelState.IsValid)
  {     
    ...

幸运的是,我没有在UpdateReimbusementMonths方法中使用Grant对象中的任何值。如果我这样做,我必须找出其他东西,因为显然TryUpdateModel会触发验证过程。