CommaDelimitedArrayModelBinder.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 == ValueProviderResult.None)
  20. {
  21. return Task.CompletedTask;
  22. }
  23. if (valueProviderResult.Length > 1)
  24. {
  25. var result = Array.CreateInstance(elementType, valueProviderResult.Length);
  26. for (int i = 0; i < valueProviderResult.Length; i++)
  27. {
  28. var value = converter.ConvertFromString(valueProviderResult.Values[i].Trim());
  29. result.SetValue(value, i);
  30. }
  31. bindingContext.Result = ModelBindingResult.Success(result);
  32. }
  33. else
  34. {
  35. var value = valueProviderResult.FirstValue;
  36. if (value != null)
  37. {
  38. var values = Array.ConvertAll(
  39. value.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries),
  40. x => converter.ConvertFromString(x?.Trim()));
  41. var typedValues = Array.CreateInstance(elementType, values.Length);
  42. values.CopyTo(typedValues, 0);
  43. bindingContext.Result = ModelBindingResult.Success(typedValues);
  44. }
  45. else
  46. {
  47. var emptyResult = Array.CreateInstance(elementType, 0);
  48. bindingContext.Result = ModelBindingResult.Success(emptyResult);
  49. }
  50. }
  51. return Task.CompletedTask;
  52. }
  53. }
  54. }