using System; using System.ComponentModel; using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.ModelBinding; namespace StardewModdingAPI.Web.Framework { /// Maps comma-delimited values to an parameter. /// Derived from . public class CommaDelimitedModelBinder : IModelBinder { /********* ** Public methods *********/ /// Attempts to bind a model. /// The model binding context. public Task BindModelAsync(ModelBindingContext bindingContext) { // validate if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext)); // extract values string modelName = bindingContext.ModelName; ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); string[] values = valueProviderResult .ToString() .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); Type elementType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0]; if (values.Length == 0) { bindingContext.Result = ModelBindingResult.Success(Array.CreateInstance(elementType, 0)); return Task.CompletedTask; } // map values TypeConverter converter = TypeDescriptor.GetConverter(elementType); Array typedArray = Array.CreateInstance(elementType, values.Length); try { for (int i = 0; i < values.Length; ++i) { string value = values[i]; object convertedValue = converter.ConvertFromString(value); typedArray.SetValue(convertedValue, i); } } catch (Exception exception) { bindingContext.ModelState.TryAddModelError(modelName, exception, bindingContext.ModelMetadata); } bindingContext.Result = ModelBindingResult.Success(typedArray); return Task.CompletedTask; } } }