1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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() ?? bindingContext.ModelType.GenericTypeArguments[0];
- 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;
- }
- }
- }
|