У меня есть сценарий, в котором я хотел бы добавить элемент в ValidationContext и проверить его при проверке сущности, запускаемой EF. Я делаю это в мастере, поэтому могу проверять определенные вещи только на определенных шагах. (Если есть хороший шаблон для этого, пожалуйста, поделитесь им).
Проблема в том, что проверка запускается, фактически, дважды, еще до того, как будет выполнено действие контроллера. Хотел бы я понять, почему. Я не уверен, как получить элемент в ValidationContext до того, как это произойдет, поэтому я не могу сказать проверке, на каком этапе я нахожусь.
Кроме того, если я выполняю пользовательскую проверку только при сохранении изменений путем проверки элемента, как в моем коде ниже, я не получаю ошибок автоматической проверки модели, отображаемых при обновлении страницы.
В моем пользовательском контексте:
public WizardStep Step { get; set; }
protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
items.Add("ValidationStep", Step);
return base.ValidateEntity(entityEntry, items);
}
Сервис, который устанавливает сущность:
public void SaveChanges(WizardStep step)
{
_context.Step = step;
_context.SaveChanges();
}
В моей сущности
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
// Step will only be present when called from save changes. Calls from model state validation won't have it
if (validationContext.Items.ContainsKey("ValidationStep"))
{
var validationStep = (WizardStep)validationContext.Items["ValidationStep"];
if (validationStep == WizardStep.Introduction)
{
if (criteria)
{
yield return new ValidationResult($"Error message ", new[] { "field" });
}
}
}
}
Контроллер:
public ActionResult MyAction(HomeViewModel vm)
{
try
{
_incidentService.AddOrUpdate(vm.Enttiy);
_incidentService.SaveChanges(WizardStep.Introduction);
}
catch (Exception ex)
{
return View(vm);
}
return RedirectToAction("Index");
}