2016-10-19 4 views
0

У меня есть настройка FluentValidation на моем веб-сайте MVC. Один из моих объектов есть проверки достоверности, который использует команду должна вызвать функцию:FluentValidation делает проверку в неподходящее время

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 является называется. Поэтому данных, которые мне нужны для проверки правильности работы, пока нет. Странно, так это то, что в моей функции редактирования проверка выполняется после вызова 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) 
    ... 

Так как я могу получить мою Добавить функцию, чтобы сделать проверку в нужное время - время после вызова функции, чтобы обновить коллекцию? Кажется, что если бы я мог повторно запустить проверки проверки после этого вызова функции, это сработает.

+0

Валидация, о которой вы упомянули, является тем, что для объекта Grant? – pjobs

+0

Не лучшее решение ... но как насчет вас Удалить ключ от ModelState (используя ModelState.Remove) перед ModelState.IsValid? Затем вы можете добавить свои гранты и добавить ключ обратно в ModelState и снова проверить его. – Sparrow

ответ

0

Я обнаружил, что он работает, чтобы метод AddGrant сделал что-то похожее на EditGrant. Вместо того, чтобы объект Гранта в качестве параметра метода я сделал это:

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

    if (ModelState.IsValid) 
    {  
    ... 

К счастью, я не использую любые значения из объекта Grant в методе UpdateReimbusementMonths. Если бы я это сделал, мне пришлось бы вычислять что-то еще, потому что, по-видимому, TryUpdateModel запускает процесс проверки.

0

Он работает в соответствии с documentation

В методе AddGrant вы публикуете объект Grant так это сделать проверку после автоматического связывания перед выполнением любого кода в методе действия.

-> Вам необходимо либо обновить грант с возмещением расходов, прежде чем отправлять или удалять текущую проверку, и выполнять эту проверку вручную в методе действий.

-> Другой вариант - написать обычай Validator Interceptors и обновить элемент гранта с помощью возмещения в методе BeforeMvcValidation. (это может быть взлом и не идеально подходит)