#asp.net-mvc #fluentvalidation
#asp.net-mvc #fluentvalidation
Вопрос:
У меня есть настройка FluentValidation на моем веб-сайте MVC. У одного из моих объектов есть проверка проверки, которая использует команду Must для вызова функции:
RuleFor(m => m).Must(m => reimbursementMonthsRequired(m)).WithMessage("Wrong!").WithName("ReimbursementStartMonth");
Функция repensementmonthsrequired проверяет значение объекта и коллекцию под объектом для определения достоверности.
У меня есть метод 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)
...
Итак, как мне заставить мою функцию Add выполнять проверку в нужное время после вызова функции для обновления коллекции? Кажется, что если бы я мог повторно запустить проверки проверки после этого вызова функции, это сработало бы.
Комментарии:
1. упомянутая вами проверка, это для объекта Grant?
2. Не лучшее решение … но как насчет того, чтобы удалить ключ из ModelState (используя ModelState. Удалить) перед ModelState. isValid? Затем вы можете добавить свои гранты и добавить ключ обратно в ModelState и снова проверить его.
Ответ №1:
Он работает в соответствии с документацией
В методе AddGrant вы публикуете объект Grant, поэтому он выполняет проверку после автоматической привязки, прежде чем выполнить какой-либо код в вашем методе действия.
-> Вам либо нужно обновить Grant с возмещениями перед публикацией, либо удалить fluent validation и выполнить эту проверку вручную в методе action.
-> Другой вариант — написать пользовательский элемент гранта Validator Interceptors
и обновить его с возмещением в BeforeMvcValidation
методе. (это может быть взломом и не идеально для выполнения)
Ответ №2:
Я обнаружил, что работает, чтобы метод AddGrant выполнял что-то похожее на EditGrant. Вместо того, чтобы принимать объект Grant в качестве параметра метода, я сделал это:
public ActionResult AddGrant(List<byte> reimbursementMonths)
{
var item = new Grant();
item.UpdateReimbusementMonths(Database, reimbursementMonths);
TryUpdateModel(item);
if (ModelState.IsValid)
{
...
К счастью, я не использую никаких значений из объекта Grant в методе UpdateReimbusementMonths. Если бы я это сделал, мне пришлось бы придумать что-то еще, потому что, по-видимому, TryUpdateModel запускает процесс проверки.