using Microsoft.AspNetCore.Mvc.ModelBinding; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace Teknik.Utilities { public class FormDataJsonBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext)); // Fetch the value of the argument by name and set it to the model state string fieldName = bindingContext.FieldName; var valueProviderResult = bindingContext.ValueProvider.GetValue(fieldName); if (valueProviderResult == ValueProviderResult.None) return Task.CompletedTask; else bindingContext.ModelState.SetModelValue(fieldName, valueProviderResult); // Do nothing if the value is null or empty string value = valueProviderResult.FirstValue; if (string.IsNullOrEmpty(value)) return Task.CompletedTask; try { // Deserialize the provided value and set the binding result object result = JsonConvert.DeserializeObject(value, bindingContext.ModelType); bindingContext.Result = ModelBindingResult.Success(result); } catch (JsonException) { bindingContext.Result = ModelBindingResult.Failed(); } return Task.CompletedTask; } } }