0

code that needs to get migrated to core 3.1.
During migration core 3.1 i encountered error as below "Severity Code Description Project File Line Suppression State Error CS0246 The type or namespace name 'MvcJsonOptions' could not be found (are you missing a using directive or an assembly reference?) JsonWithFilesFormDataModelBinder.cs 13 Active " As in core 3.* - the breaking changes is MvcJsonOptions As i am using this in Class library project unable to configure in startup.cs Facing the above error.

I already refered Package <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.22" /> for the use of using Microsoft.AspNetCore.Mvc.NewtonsoftJson;

public class JsonWithFilesFormDataModelBinder : IModelBinder {
        private readonly IOptions<MvcJsonOptions> _jsonOptions;
        private readonly FormFileModelBinder _formFileModelBinder;

        public JsonWithFilesFormDataModelBinder(IOptions<MvcJsonOptions> jsonOptions, ILoggerFactory loggerFactory) {
            _jsonOptions = jsonOptions;
            _formFileModelBinder = new FormFileModelBinder(loggerFactory);
        }

        public async Task BindModelAsync(ModelBindingContext bindingContext) {
            if (bindingContext == null)
                throw new ArgumentNullException(nameof(bindingContext));

            // Retrieve the form part containing the JSON
            var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.FieldName);
            if (valueResult == ValueProviderResult.None) {
                // The JSON was not found
                var message = bindingContext.ModelMetadata.ModelBindingMessageProvider.MissingBindRequiredValueAccessor(bindingContext.FieldName);
                bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, message);
                return;
            }

            var rawValue = valueResult.FirstValue;

            // Deserialize the JSON
            //var model = JsonConvert.DeserializeObject(rawValue, bindingContext.ModelType, _jsonOptions.Value.SerializerSettings);
            //var model = bindingContext.ModelName;
            var model = JsonSerializer.Deserialize<IOptions>(jsonString);

            // Now, bind each of the IFormFile properties from the other form parts
            foreach (var property in bindingContext.ModelMetadata.Properties) {
                if (property.ModelType == typeof(IFormFile) || property.ModelType == typeof(IFormFile[])) {

                    var fieldName = property.BinderModelName ?? property.PropertyName;
                    var modelName = fieldName;
                    var propertyModel = property.PropertyGetter(bindingContext.Model);
                    ModelBindingResult propertyResult;
                    using (bindingContext.EnterNestedScope(property, fieldName, modelName, propertyModel)) {
                        await _formFileModelBinder.BindModelAsync(bindingContext);
                        propertyResult = bindingContext.Result;
                    }

                    if (propertyResult.IsModelSet) {
                        // The IFormFile was sucessfully bound, assign it to the corresponding property of the model
                        property.PropertySetter(model, propertyResult.Model);
                    } else if (property.IsBindingRequired) {
                        var message = property.ModelBindingMessageProvider.MissingBindRequiredValueAccessor(fieldName);
                        bindingContext.ModelState.TryAddModelError(modelName, message);
                    }
                }
            }

            // Set the successfully constructed model as the result of the model binding
            bindingContext.Result = ModelBindingResult.Success(model);
        }
    }
Madhavi G
  • 1
  • 2
  • Hi @Madhavi G, `MvcJsonOptions` exists in `Microsoft.AspNetCore.Mvc.Formatters.Json` package. But this package has been removed from asp.net core 3.x and not support again. What if try to use `MvcNewtonsoftJsonOptions`? – Rena Dec 17 '21 at 09:44

0 Answers0