diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/IModelBindingMessageProvider.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/ModelBindingMessageProvider.cs similarity index 80% rename from src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/IModelBindingMessageProvider.cs rename to src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/ModelBindingMessageProvider.cs index f189da7094..23918bd649 100644 --- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/IModelBindingMessageProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/ModelBindingMessageProvider.cs @@ -8,62 +8,62 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata /// /// Provider for error messages the model binding system detects. /// - public interface IModelBindingMessageProvider + public abstract class ModelBindingMessageProvider { /// /// Error message the model binding system adds when a property with an associated /// BindRequiredAttribute is not bound. /// /// Default is "A value for the '{0}' property was not provided.". - Func MissingBindRequiredValueAccessor { get; } + public virtual Func MissingBindRequiredValueAccessor { get; } /// /// Error message the model binding system adds when either the key or the value of a /// is bound but not both. /// /// Default is "A value is required.". - Func MissingKeyOrValueAccessor { get; } + public virtual Func MissingKeyOrValueAccessor { get; } /// /// Error message the model binding system adds when no value is provided for the request body, /// but a value is required. /// /// Default is "A non-empty request body is required.". - Func MissingRequestBodyRequiredValueAccessor { get; } + public virtual Func MissingRequestBodyRequiredValueAccessor { get; } /// /// Error message the model binding system adds when a null value is bound to a /// non- property. /// /// Default is "The value '{0}' is invalid.". - Func ValueMustNotBeNullAccessor { get; } + public virtual Func ValueMustNotBeNullAccessor { get; } /// /// Error message the model binding system adds when is of type /// or and value is known. /// /// Default is "The value '{0}' is not valid for {1}.". - Func AttemptedValueIsInvalidAccessor { get; } + public virtual Func AttemptedValueIsInvalidAccessor { get; } /// /// Error message the model binding system adds when is of type /// or and value is unknown. /// /// Default is "The supplied value is invalid for {0}.". - Func UnknownValueIsInvalidAccessor { get; } + public virtual Func UnknownValueIsInvalidAccessor { get; } /// /// Fallback error message HTML and tag helpers display when a property is invalid but the /// s have null s. /// /// Default is "The value '{0}' is invalid.". - Func ValueIsInvalidAccessor { get; } + public virtual Func ValueIsInvalidAccessor { get; } /// /// Error message HTML and tag helpers add for client-side validation of numeric formats. Visible in the /// browser if the field for a float property (for example) does not have a correctly-formatted value. /// /// Default is "The field {0} must be a number.". - Func ValueMustBeANumberAccessor { get; } + public virtual Func ValueMustBeANumberAccessor { get; } } } diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelMetadata.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelMetadata.cs index 5218ef5e71..36a2f4b357 100644 --- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelMetadata.cs +++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelMetadata.cs @@ -256,9 +256,9 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding public abstract bool IsRequired { get; } /// - /// Gets the instance. + /// Gets the instance. /// - public abstract IModelBindingMessageProvider ModelBindingMessageProvider { get; } + public abstract ModelBindingMessageProvider ModelBindingMessageProvider { get; } /// /// Gets a value indicating where the current metadata should be ordered relative to other properties diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Mvc.Abstractions/breakingchanges.netcore.json index eac86224d4..528bb7f5fb 100644 --- a/src/Microsoft.AspNetCore.Mvc.Abstractions/breakingchanges.netcore.json +++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/breakingchanges.netcore.json @@ -1,7 +1,11 @@ [ { "TypeId": "public interface Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.IModelBindingMessageProvider", - "MemberId": "System.Func get_MissingRequestBodyRequiredValueAccessor()", - "Kind": "Addition" + "Kind": "Removal" + }, + { + "TypeId": "public abstract class Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata : System.IEquatable", + "MemberId": "public abstract Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.IModelBindingMessageProvider get_ModelBindingMessageProvider()", + "Kind": "Removal" } ] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/BindingMetadata.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/BindingMetadata.cs index 47352d3cb1..2cf3e8ae5f 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/BindingMetadata.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/BindingMetadata.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata /// public class BindingMetadata { - private ModelBindingMessageProvider _messageProvider; + private DefaultModelBindingMessageProvider _messageProvider; /// /// Gets or sets the . @@ -53,10 +53,10 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata public bool? IsReadOnly { get; set; } /// - /// Gets the instance. See + /// Gets the instance. See /// . /// - public ModelBindingMessageProvider ModelBindingMessageProvider + public DefaultModelBindingMessageProvider ModelBindingMessageProvider { get { diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelBindingMessageProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelBindingMessageProvider.cs new file mode 100644 index 0000000000..938d4f854e --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelBindingMessageProvider.cs @@ -0,0 +1,196 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Mvc.Core; + +namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata +{ + /// + /// Read / write implementation. + /// + public class DefaultModelBindingMessageProvider : ModelBindingMessageProvider + { + private Func _missingBindRequiredValueAccessor; + private Func _missingKeyOrValueAccessor; + private Func _missingRequestBodyRequiredValueAccessor; + private Func _valueMustNotBeNullAccessor; + private Func _attemptedValueIsInvalidAccessor; + private Func _unknownValueIsInvalidAccessor; + private Func _valueIsInvalidAccessor; + private Func _valueMustBeANumberAccessor; + + /// + /// Initializes a new instance of the class. + /// + public DefaultModelBindingMessageProvider() + { + SetMissingBindRequiredValueAccessor(Resources.FormatModelBinding_MissingBindRequiredMember); + SetMissingKeyOrValueAccessor(Resources.FormatKeyValuePair_BothKeyAndValueMustBePresent); + SetMissingRequestBodyRequiredValueAccessor(Resources.FormatModelBinding_MissingRequestBodyRequiredMember); + SetValueMustNotBeNullAccessor(Resources.FormatModelBinding_NullValueNotValid); + SetAttemptedValueIsInvalidAccessor(Resources.FormatModelState_AttemptedValueIsInvalid); + SetUnknownValueIsInvalidAccessor(Resources.FormatModelState_UnknownValueIsInvalid); + SetValueIsInvalidAccessor(Resources.FormatHtmlGeneration_ValueIsInvalid); + SetValueMustBeANumberAccessor(Resources.FormatHtmlGeneration_ValueMustBeNumber); + } + + /// + /// Initializes a new instance of the class based on + /// . + /// + /// The to duplicate. + public DefaultModelBindingMessageProvider(DefaultModelBindingMessageProvider originalProvider) + { + if (originalProvider == null) + { + throw new ArgumentNullException(nameof(originalProvider)); + } + + SetMissingBindRequiredValueAccessor(originalProvider.MissingBindRequiredValueAccessor); + SetMissingKeyOrValueAccessor(originalProvider.MissingKeyOrValueAccessor); + SetMissingRequestBodyRequiredValueAccessor(originalProvider.MissingRequestBodyRequiredValueAccessor); + SetValueMustNotBeNullAccessor(originalProvider.ValueMustNotBeNullAccessor); + SetAttemptedValueIsInvalidAccessor(originalProvider.AttemptedValueIsInvalidAccessor); + SetUnknownValueIsInvalidAccessor(originalProvider.UnknownValueIsInvalidAccessor); + SetValueIsInvalidAccessor(originalProvider.ValueIsInvalidAccessor); + SetValueMustBeANumberAccessor(originalProvider.ValueMustBeANumberAccessor); + } + + /// + public override Func MissingBindRequiredValueAccessor => _missingBindRequiredValueAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetMissingBindRequiredValueAccessor(Func missingBindRequiredValueAccessor) + { + if (missingBindRequiredValueAccessor == null) + { + throw new ArgumentNullException(nameof(missingBindRequiredValueAccessor)); + } + + _missingBindRequiredValueAccessor = missingBindRequiredValueAccessor; + } + + /// + public override Func MissingKeyOrValueAccessor => _missingKeyOrValueAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetMissingKeyOrValueAccessor(Func missingKeyOrValueAccessor) + { + if (missingKeyOrValueAccessor == null) + { + throw new ArgumentNullException(nameof(missingKeyOrValueAccessor)); + } + + _missingKeyOrValueAccessor = missingKeyOrValueAccessor; + } + + /// + public override Func MissingRequestBodyRequiredValueAccessor => _missingRequestBodyRequiredValueAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetMissingRequestBodyRequiredValueAccessor(Func missingRequestBodyRequiredValueAccessor) + { + if (missingRequestBodyRequiredValueAccessor == null) + { + throw new ArgumentNullException(nameof(missingRequestBodyRequiredValueAccessor)); + } + + _missingRequestBodyRequiredValueAccessor = missingRequestBodyRequiredValueAccessor; + } + + /// + public override Func ValueMustNotBeNullAccessor => _valueMustNotBeNullAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetValueMustNotBeNullAccessor(Func valueMustNotBeNullAccessor) + { + if (valueMustNotBeNullAccessor == null) + { + throw new ArgumentNullException(nameof(valueMustNotBeNullAccessor)); + } + + _valueMustNotBeNullAccessor = valueMustNotBeNullAccessor; + } + + /// + public override Func AttemptedValueIsInvalidAccessor => _attemptedValueIsInvalidAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetAttemptedValueIsInvalidAccessor(Func attemptedValueIsInvalidAccessor) + { + if (attemptedValueIsInvalidAccessor == null) + { + throw new ArgumentNullException(nameof(attemptedValueIsInvalidAccessor)); + } + + _attemptedValueIsInvalidAccessor = attemptedValueIsInvalidAccessor; + } + + /// + public override Func UnknownValueIsInvalidAccessor => _unknownValueIsInvalidAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetUnknownValueIsInvalidAccessor(Func unknownValueIsInvalidAccessor) + { + if (unknownValueIsInvalidAccessor == null) + { + throw new ArgumentNullException(nameof(unknownValueIsInvalidAccessor)); + } + + _unknownValueIsInvalidAccessor = unknownValueIsInvalidAccessor; + } + + /// + public override Func ValueIsInvalidAccessor => _valueIsInvalidAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetValueIsInvalidAccessor(Func valueIsInvalidAccessor) + { + if (valueIsInvalidAccessor == null) + { + throw new ArgumentNullException(nameof(valueIsInvalidAccessor)); + } + + _valueIsInvalidAccessor = valueIsInvalidAccessor; + } + + /// + public override Func ValueMustBeANumberAccessor => _valueMustBeANumberAccessor; + + /// + /// Sets the property. + /// + /// The value to set. + public void SetValueMustBeANumberAccessor(Func valueMustBeANumberAccessor) + { + if (valueMustBeANumberAccessor == null) + { + throw new ArgumentNullException(nameof(valueMustBeANumberAccessor)); + } + + _valueMustBeANumberAccessor = valueMustBeANumberAccessor; + } + } +} diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadata.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadata.cs index f2d7adef2f..d1d2052fd3 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadata.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadata.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata // Default message provider for all DefaultModelMetadata instances; cloned before exposing to // IBindingMetadataProvider instances to ensure customizations are not accidentally shared. - private readonly ModelBindingMessageProvider _modelBindingMessageProvider; + private readonly DefaultModelBindingMessageProvider _modelBindingMessageProvider; private ReadOnlyDictionary _additionalValues; private ModelMetadata _elementMetadata; @@ -41,7 +41,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata IModelMetadataProvider provider, ICompositeMetadataDetailsProvider detailsProvider, DefaultMetadataDetails details) - : this(provider, detailsProvider, details, new ModelBindingMessageProvider()) + : this(provider, detailsProvider, details, new DefaultModelBindingMessageProvider()) { } @@ -51,12 +51,12 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata /// The . /// The . /// The . - /// The . + /// The . public DefaultModelMetadata( IModelMetadataProvider provider, ICompositeMetadataDetailsProvider detailsProvider, DefaultMetadataDetails details, - ModelBindingMessageProvider modelBindingMessageProvider) + DefaultModelBindingMessageProvider modelBindingMessageProvider) : base(details.Key) { if (provider == null) @@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata // Provide a unique ModelBindingMessageProvider instance so providers' customizations are per-type. context.BindingMetadata.ModelBindingMessageProvider = - new ModelBindingMessageProvider(_modelBindingMessageProvider); + new DefaultModelBindingMessageProvider(_modelBindingMessageProvider); _detailsProvider.CreateBindingMetadata(context); _details.BindingMetadata = context.BindingMetadata; @@ -440,7 +440,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata } /// - public override IModelBindingMessageProvider ModelBindingMessageProvider + public override ModelBindingMessageProvider ModelBindingMessageProvider { get { diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs index fc43e72ebf..05d7c47984 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata /// /// The . public DefaultModelMetadataProvider(ICompositeMetadataDetailsProvider detailsProvider) - : this(detailsProvider, new ModelBindingMessageProvider()) + : this(detailsProvider, new DefaultModelBindingMessageProvider()) { } @@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata private DefaultModelMetadataProvider( ICompositeMetadataDetailsProvider detailsProvider, - ModelBindingMessageProvider modelBindingMessageProvider) + DefaultModelBindingMessageProvider modelBindingMessageProvider) { if (detailsProvider == null) { @@ -62,10 +62,10 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata protected ICompositeMetadataDetailsProvider DetailsProvider { get; } /// - /// Gets the . + /// Gets the . /// /// Same as in all production scenarios. - protected ModelBindingMessageProvider ModelBindingMessageProvider { get; } + protected DefaultModelBindingMessageProvider ModelBindingMessageProvider { get; } /// public virtual IEnumerable GetMetadataForProperties(Type modelType) @@ -110,7 +110,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata return cacheEntry.Metadata; } - private static ModelBindingMessageProvider GetMessageProvider(IOptions optionsAccessor) + private static DefaultModelBindingMessageProvider GetMessageProvider(IOptions optionsAccessor) { if (optionsAccessor == null) { diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/ModelBindingMessageProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/ModelBindingMessageProvider.cs deleted file mode 100644 index a4fee0832a..0000000000 --- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/ModelBindingMessageProvider.cs +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Mvc.Core; - -namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata -{ - /// - /// Read / write implementation. - /// - public class ModelBindingMessageProvider : IModelBindingMessageProvider - { - private Func _missingBindRequiredValueAccessor; - private Func _missingKeyOrValueAccessor; - private Func _missingRequestBodyRequiredValueAccessor; - private Func _valueMustNotBeNullAccessor; - private Func _attemptedValueIsInvalidAccessor; - private Func _unknownValueIsInvalidAccessor; - private Func _valueIsInvalidAccessor; - private Func _valueMustBeANumberAccessor; - - /// - /// Initializes a new instance of the class. - /// - public ModelBindingMessageProvider() - { - MissingBindRequiredValueAccessor = Resources.FormatModelBinding_MissingBindRequiredMember; - MissingKeyOrValueAccessor = Resources.FormatKeyValuePair_BothKeyAndValueMustBePresent; - MissingRequestBodyRequiredValueAccessor = Resources.FormatModelBinding_MissingRequestBodyRequiredMember; - ValueMustNotBeNullAccessor = Resources.FormatModelBinding_NullValueNotValid; - AttemptedValueIsInvalidAccessor = Resources.FormatModelState_AttemptedValueIsInvalid; - UnknownValueIsInvalidAccessor = Resources.FormatModelState_UnknownValueIsInvalid; - ValueIsInvalidAccessor = Resources.FormatHtmlGeneration_ValueIsInvalid; - ValueMustBeANumberAccessor = Resources.FormatHtmlGeneration_ValueMustBeNumber; - } - - /// - /// Initializes a new instance of the class based on - /// . - /// - /// The to duplicate. - public ModelBindingMessageProvider(ModelBindingMessageProvider originalProvider) - { - if (originalProvider == null) - { - throw new ArgumentNullException(nameof(originalProvider)); - } - - MissingBindRequiredValueAccessor = originalProvider.MissingBindRequiredValueAccessor; - MissingKeyOrValueAccessor = originalProvider.MissingKeyOrValueAccessor; - MissingRequestBodyRequiredValueAccessor = originalProvider.MissingRequestBodyRequiredValueAccessor; - ValueMustNotBeNullAccessor = originalProvider.ValueMustNotBeNullAccessor; - AttemptedValueIsInvalidAccessor = originalProvider.AttemptedValueIsInvalidAccessor; - UnknownValueIsInvalidAccessor = originalProvider.UnknownValueIsInvalidAccessor; - ValueIsInvalidAccessor = originalProvider.ValueIsInvalidAccessor; - ValueMustBeANumberAccessor = originalProvider.ValueMustBeANumberAccessor; - } - - /// - public Func MissingBindRequiredValueAccessor - { - get - { - return _missingBindRequiredValueAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _missingBindRequiredValueAccessor = value; - } - } - - /// - public Func MissingKeyOrValueAccessor - { - get - { - return _missingKeyOrValueAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _missingKeyOrValueAccessor = value; - } - } - - /// - public Func MissingRequestBodyRequiredValueAccessor - { - get - { - return _missingRequestBodyRequiredValueAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _missingRequestBodyRequiredValueAccessor = value; - } - } - - /// - public Func ValueMustNotBeNullAccessor - { - get - { - return _valueMustNotBeNullAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _valueMustNotBeNullAccessor = value; - } - } - - /// - public Func AttemptedValueIsInvalidAccessor - { - get - { - return _attemptedValueIsInvalidAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _attemptedValueIsInvalidAccessor = value; - } - } - - /// - public Func UnknownValueIsInvalidAccessor - { - get - { - return _unknownValueIsInvalidAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _unknownValueIsInvalidAccessor = value; - } - } - - /// - public Func ValueIsInvalidAccessor - { - get - { - return _valueIsInvalidAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _valueIsInvalidAccessor = value; - } - } - - /// - public Func ValueMustBeANumberAccessor - { - get - { - return _valueMustBeANumberAccessor; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _valueMustBeANumberAccessor = value; - } - } - } -} diff --git a/src/Microsoft.AspNetCore.Mvc.Core/MvcOptions.cs b/src/Microsoft.AspNetCore.Mvc.Core/MvcOptions.cs index 77332ae7ea..8555a18945 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/MvcOptions.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/MvcOptions.cs @@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Mvc InputFormatters = new FormatterCollection(); OutputFormatters = new FormatterCollection(); ModelBinderProviders = new List(); - ModelBindingMessageProvider = new ModelBindingMessageProvider(); + ModelBindingMessageProvider = new DefaultModelBindingMessageProvider(); ModelMetadataDetailsProviders = new List(); ModelValidatorProviders = new List(); ValueProviderFactories = new List(); @@ -98,11 +98,11 @@ namespace Microsoft.AspNetCore.Mvc public IList ModelBinderProviders { get; } /// - /// Gets the default . Changes here are copied to the + /// Gets the default . Changes here are copied to the /// property of all /// instances unless overridden in a custom . /// - public ModelBindingMessageProvider ModelBindingMessageProvider { get; } + public DefaultModelBindingMessageProvider ModelBindingMessageProvider { get; } /// /// Gets a list of instances that will be used to diff --git a/src/Microsoft.AspNetCore.Mvc.Core/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Mvc.Core/breakingchanges.netcore.json index 10a979e1c5..ef60408729 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/breakingchanges.netcore.json +++ b/src/Microsoft.AspNetCore.Mvc.Core/breakingchanges.netcore.json @@ -121,5 +121,29 @@ "TypeId": "public abstract class Microsoft.AspNetCore.Mvc.ControllerBase", "MemberId": "public virtual Microsoft.AspNetCore.Mvc.SignOutResult SignOut(Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties properties, params System.String[] authenticationSchemes)", "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelBindingMessageProvider : Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.IModelBindingMessageProvider", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.AspNetCore.Mvc.MvcOptions", + "MemberId": "public Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelBindingMessageProvider get_ModelBindingMessageProvider()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.BindingMetadata", + "MemberId": "public Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelBindingMessageProvider get_ModelBindingMessageProvider()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.BindingMetadata", + "MemberId": "public System.Void set_ModelBindingMessageProvider(Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelBindingMessageProvider value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata : Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata", + "MemberId": "public override Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.IModelBindingMessageProvider get_ModelBindingMessageProvider()", + "Kind": "Removal" } ] \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs b/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs index bb13997b16..7be03ba94d 100644 --- a/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs @@ -527,7 +527,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding } } - public override IModelBindingMessageProvider ModelBindingMessageProvider + public override ModelBindingMessageProvider ModelBindingMessageProvider { get { diff --git a/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelStateDictionaryTest.cs b/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelStateDictionaryTest.cs index 3611cee6ed..d9f891ccb2 100644 --- a/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelStateDictionaryTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelStateDictionaryTest.cs @@ -890,8 +890,8 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding var bindingMetadataProvider = new DefaultBindingMetadataProvider(); var compositeProvider = new DefaultCompositeMetadataDetailsProvider(new[] { bindingMetadataProvider }); var optionsAccessor = new OptionsAccessor(); - optionsAccessor.Value.ModelBindingMessageProvider.UnknownValueIsInvalidAccessor = - name => $"Hmm, the supplied value is not valid for { name }."; + optionsAccessor.Value.ModelBindingMessageProvider.SetUnknownValueIsInvalidAccessor( + name => $"Hmm, the supplied value is not valid for { name }."); var provider = new DefaultModelMetadataProvider(compositeProvider, optionsAccessor); var metadata = provider.GetMetadataForProperty(typeof(string), nameof(string.Length)); @@ -935,8 +935,8 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding var bindingMetadataProvider = new DefaultBindingMetadataProvider(); var compositeProvider = new DefaultCompositeMetadataDetailsProvider(new[] { bindingMetadataProvider }); var optionsAccessor = new OptionsAccessor(); - optionsAccessor.Value.ModelBindingMessageProvider.AttemptedValueIsInvalidAccessor = - (value, name) => $"Hmm, the value '{ value }' is not valid for { name }."; + optionsAccessor.Value.ModelBindingMessageProvider.SetAttemptedValueIsInvalidAccessor( + (value, name) => $"Hmm, the value '{ value }' is not valid for { name }."); var provider = new DefaultModelMetadataProvider(compositeProvider, optionsAccessor); var metadata = provider.GetMetadataForProperty(typeof(string), nameof(string.Length)); diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/BodyModelBinderTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/BodyModelBinderTests.cs index f568ba7cde..3368825329 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/BodyModelBinderTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/BodyModelBinderTests.cs @@ -131,8 +131,8 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders provider.ForType().BindingDetails(d => { d.BindingSource = BindingSource.Body; - d.ModelBindingMessageProvider.MissingRequestBodyRequiredValueAccessor = - () => "Customized error message"; + d.ModelBindingMessageProvider.SetMissingRequestBodyRequiredValueAccessor( + () => "Customized error message"); }); var bindingContext = GetBindingContext( diff --git a/test/Microsoft.AspNetCore.Mvc.DataAnnotations.Test/Internal/NumericClientModelValidatorTest.cs b/test/Microsoft.AspNetCore.Mvc.DataAnnotations.Test/Internal/NumericClientModelValidatorTest.cs index 348f7d63ab..e1f0f28264 100644 --- a/test/Microsoft.AspNetCore.Mvc.DataAnnotations.Test/Internal/NumericClientModelValidatorTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.DataAnnotations.Test/Internal/NumericClientModelValidatorTest.cs @@ -45,8 +45,11 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations.Internal var provider = new TestModelMetadataProvider(); provider .ForProperty(typeof(TypeWithNumericProperty), nameof(TypeWithNumericProperty.Id)) - .BindingDetails(d => d.ModelBindingMessageProvider.ValueMustBeANumberAccessor = - name => $"Error message about '{ name }' from override."); + .BindingDetails(d => + { + d.ModelBindingMessageProvider.SetValueMustBeANumberAccessor( + name => $"Error message about '{ name }' from override."); + }); var metadata = provider.GetMetadataForProperty( typeof(TypeWithNumericProperty), nameof(TypeWithNumericProperty.Id)); diff --git a/test/Microsoft.AspNetCore.Mvc.IntegrationTests/ComplexTypeModelBinderIntegrationTest.cs b/test/Microsoft.AspNetCore.Mvc.IntegrationTests/ComplexTypeModelBinderIntegrationTest.cs index 62720b89fe..2346db3912 100644 --- a/test/Microsoft.AspNetCore.Mvc.IntegrationTests/ComplexTypeModelBinderIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.IntegrationTests/ComplexTypeModelBinderIntegrationTest.cs @@ -1847,8 +1847,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests .BindingDetails((Action)(binding => { // A real details provider could customize message based on BindingMetadataProviderContext. - binding.ModelBindingMessageProvider.MissingBindRequiredValueAccessor = - name => $"Hurts when '{ name }' is not provided."; + binding.ModelBindingMessageProvider.SetMissingBindRequiredValueAccessor( + name => $"Hurts when '{ name }' is not provided."); })); var parameterBinder = ModelBindingTestHelper.GetParameterBinder(metadataProvider); diff --git a/test/Microsoft.AspNetCore.Mvc.IntegrationTests/KeyValuePairModelBinderIntegrationTest.cs b/test/Microsoft.AspNetCore.Mvc.IntegrationTests/KeyValuePairModelBinderIntegrationTest.cs index 3bca8162ff..985fe67c2c 100644 --- a/test/Microsoft.AspNetCore.Mvc.IntegrationTests/KeyValuePairModelBinderIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.IntegrationTests/KeyValuePairModelBinderIntegrationTest.cs @@ -100,7 +100,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests .BindingDetails((System.Action)(binding => { // A real details provider could customize message based on BindingMetadataProviderContext. - binding.ModelBindingMessageProvider.MissingKeyOrValueAccessor = () => $"Hurts when nothing is provided."; + binding.ModelBindingMessageProvider.SetMissingKeyOrValueAccessor( + () => $"Hurts when nothing is provided."); })); var parameterBinder = ModelBindingTestHelper.GetParameterBinder(metadataProvider); @@ -183,7 +184,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests .BindingDetails((System.Action)(binding => { // A real details provider could customize message based on BindingMetadataProviderContext. - binding.ModelBindingMessageProvider.MissingKeyOrValueAccessor = () => $"Hurts when nothing is provided."; + binding.ModelBindingMessageProvider.SetMissingKeyOrValueAccessor( + () => $"Hurts when nothing is provided."); })); var parameterBinder = ModelBindingTestHelper.GetParameterBinder(metadataProvider); diff --git a/test/Microsoft.AspNetCore.Mvc.IntegrationTests/SimpleTypeModelBinderIntegrationTest.cs b/test/Microsoft.AspNetCore.Mvc.IntegrationTests/SimpleTypeModelBinderIntegrationTest.cs index 915f2f35e5..cc54117119 100644 --- a/test/Microsoft.AspNetCore.Mvc.IntegrationTests/SimpleTypeModelBinderIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.IntegrationTests/SimpleTypeModelBinderIntegrationTest.cs @@ -256,8 +256,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests .BindingDetails(binding => { // A real details provider could customize message based on BindingMetadataProviderContext. - binding.ModelBindingMessageProvider.AttemptedValueIsInvalidAccessor = - (value, name) => $"Hmm, '{ value }' is not a valid value for '{ name }'."; + binding.ModelBindingMessageProvider.SetAttemptedValueIsInvalidAccessor( + (value, name) => $"Hmm, '{ value }' is not a valid value for '{ name }'."); }); var parameterBinder = ModelBindingTestHelper.GetParameterBinder(metadataProvider); var parameter = new ParameterDescriptor() @@ -357,8 +357,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests .BindingDetails(binding => { // A real details provider could customize message based on BindingMetadataProviderContext. - binding.ModelBindingMessageProvider.ValueMustNotBeNullAccessor = - value => $"Hurts when '{ value }' is provided."; + binding.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor( + value => $"Hurts when '{ value }' is provided."); }); var parameterBinder = ModelBindingTestHelper.GetParameterBinder(metadataProvider);