Back to Aspnetcore

Breaking change: MVC: ObjectModelValidator calls a new overload of ValidationVisitor.Validate

aspnetcore/breaking-changes/5/mvc-objectmodelvalidator-calls-new-overload.md

latest2.2 KB
Original Source

MVC: ObjectModelValidator calls a new overload of ValidationVisitor.Validate

In ASP.NET Core 5.0, an overload of the xref:Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Validate%2A?displayProperty=nameWithType was added. The new overload accepts the top-level model instance that contains properties:

diff
  bool Validate(ModelMetadata metadata, string key, object model, bool alwaysValidateAtTopLevel);
+ bool Validate(ModelMetadata metadata, string key, object model, bool alwaysValidateAtTopLevel, object container);

xref:Microsoft.AspNetCore.Mvc.ModelBinding.ObjectModelValidator invokes this new overload of ValidationVisitor to perform validation. This new overload is pertinent if your validation library integrates with ASP.NET Core MVC's model validation system.

For discussion, see GitHub issue dotnet/aspnetcore#26020.

Version introduced

5.0

Old behavior

ObjectModelValidator invokes the following overload during model validation:

csharp
ValidationVisitor.Validate(ModelMetadata metadata, string key, object model, bool alwaysValidateAtTopLevel)

New behavior

ObjectModelValidator invokes the following overload during model validation:

csharp
ValidationVisitor.Validate(ModelMetadata metadata, string key, object model, bool alwaysValidateAtTopLevel, object container)

Reason for change

This change was introduced to support validators, such as xref:System.ComponentModel.DataAnnotations.CompareAttribute, that rely on inspection of other properties.

Validation frameworks that rely on ObjectModelValidator to invoke the existing overload of ValidationVisitor must override the new method when targeting .NET 5 or later:

csharp
public class MyCustomValidationVisitor : ValidationVisitor
{
+  public override bool Validate(ModelMetadata metadata, string key, object model, bool alwaysValidateAtTopLevel, object container)
+  {
+    ...
}

Affected APIs

xref:Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Validate%2A?displayProperty=nameWithType

<!-- ### Category ASP.NET Core ### Affected APIs `Overload:Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Validate` -->