diff options
| author | BaronGreenback <jimcartlidge@yahoo.co.uk> | 2020-10-11 21:30:57 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-11 21:30:57 +0100 |
| commit | 0f47b3ec2df94ec68cbdad11fb6c8150239295ea (patch) | |
| tree | 4997f97563caa2cefa949d2de4d195f7e06b4f12 /Jellyfin.Api/ModelBinders | |
| parent | c41ed13b3dd875498b5784f11250ae7f421d94e2 (diff) | |
| parent | 2375c35c4a966a469dd97f33deb57b342498b905 (diff) | |
Merge branch 'master' into Comment4
Diffstat (limited to 'Jellyfin.Api/ModelBinders')
| -rw-r--r-- | Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs | 59 | ||||
| -rw-r--r-- | Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinderProvider.cs | 29 |
2 files changed, 88 insertions, 0 deletions
diff --git a/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs b/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs new file mode 100644 index 000000000..208566dc8 --- /dev/null +++ b/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs @@ -0,0 +1,59 @@ +using System; +using System.ComponentModel; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.ModelBinding; + +namespace Jellyfin.Api.ModelBinders +{ + /// <summary> + /// Comma delimited array model binder. + /// Returns an empty array of specified type if there is no query parameter. + /// </summary> + public class CommaDelimitedArrayModelBinder : IModelBinder + { + /// <inheritdoc/> + public Task BindModelAsync(ModelBindingContext bindingContext) + { + var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); + var elementType = bindingContext.ModelType.GetElementType(); + var converter = TypeDescriptor.GetConverter(elementType); + + if (valueProviderResult.Length > 1) + { + var result = Array.CreateInstance(elementType, valueProviderResult.Length); + + for (int i = 0; i < valueProviderResult.Length; i++) + { + var value = converter.ConvertFromString(valueProviderResult.Values[i].Trim()); + + result.SetValue(value, i); + } + + bindingContext.Result = ModelBindingResult.Success(result); + } + else + { + var value = valueProviderResult.FirstValue; + + if (value != null) + { + var values = Array.ConvertAll( + value.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries), + x => converter.ConvertFromString(x?.Trim())); + + var typedValues = Array.CreateInstance(elementType, values.Length); + values.CopyTo(typedValues, 0); + + bindingContext.Result = ModelBindingResult.Success(typedValues); + } + else + { + var emptyResult = Array.CreateInstance(elementType, 0); + bindingContext.Result = ModelBindingResult.Success(emptyResult); + } + } + + return Task.CompletedTask; + } + } +} diff --git a/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinderProvider.cs b/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinderProvider.cs new file mode 100644 index 000000000..b9785a73b --- /dev/null +++ b/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinderProvider.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.AspNetCore.Mvc.ModelBinding; + +namespace Jellyfin.Api.ModelBinders +{ + /// <summary> + /// Comma delimited array model binder provider. + /// </summary> + public class CommaDelimitedArrayModelBinderProvider : IModelBinderProvider + { + private readonly IModelBinder _binder; + + /// <summary> + /// Initializes a new instance of the <see cref="CommaDelimitedArrayModelBinderProvider"/> class. + /// </summary> + public CommaDelimitedArrayModelBinderProvider() + { + _binder = new CommaDelimitedArrayModelBinder(); + } + + /// <inheritdoc /> + public IModelBinder? GetBinder(ModelBinderProviderContext context) + { + return context.Metadata.ModelType.IsArray ? _binder : null; + } + } +} |
