CommaDelimitedArrayModelBinder.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System;
  2. using System.ComponentModel;
  3. using System.Threading.Tasks;
  4. using Microsoft.AspNetCore.Mvc.ModelBinding;
  5. namespace Jellyfin.Api.ModelBinders
  6. {
  7. /// <summary>
  8. /// Comma delimited array model binder.
  9. /// Returns an empty array of specified type if there is no query parameter.
  10. /// </summary>
  11. public class CommaDelimitedArrayModelBinder : IModelBinder
  12. {
  13. /// <inheritdoc/>
  14. public Task BindModelAsync(ModelBindingContext bindingContext)
  15. {
  16. var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
  17. var elementType = bindingContext.ModelType.GetElementType();
  18. var converter = TypeDescriptor.GetConverter(elementType);
  19. if (valueProviderResult.Length > 1)
  20. {
  21. var result = Array.CreateInstance(elementType, valueProviderResult.Length);
  22. for (int i = 0; i < valueProviderResult.Length; i++)
  23. {
  24. var value = converter.ConvertFromString(valueProviderResult.Values[i].Trim());
  25. result.SetValue(value, i);
  26. }
  27. bindingContext.Result = ModelBindingResult.Success(result);
  28. }
  29. else
  30. {
  31. var value = valueProviderResult.FirstValue;
  32. if (value != null)
  33. {
  34. var values = Array.ConvertAll(
  35. value.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries),
  36. x => { return converter.ConvertFromString(x != null ? x.Trim() : x); });
  37. var typedValues = Array.CreateInstance(elementType, values.Length);
  38. values.CopyTo(typedValues, 0);
  39. bindingContext.Result = ModelBindingResult.Success(typedValues);
  40. }
  41. else
  42. {
  43. var emptyResult = Array.CreateInstance(elementType, 0);
  44. bindingContext.Result = ModelBindingResult.Success(emptyResult);
  45. }
  46. }
  47. return Task.CompletedTask;
  48. }
  49. }
  50. }