我在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函数在适当的时候进行验证 - 在函数调用之后更新集合?似乎如果我可以在该函数调用之后重新运行验证检查,那就可以了。
答案 0 :(得分:0)
在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会触发验证过程。