Класс FromUriAttribute
объединяет классы FromRouteAttribute
и FromQueryAttribute
. В зависимости от конфигурации ваших маршрутов / отправляемого запроса вы сможете заменить свой атрибут одним из них.
Однако есть прокладка, которая даст вам класс FromUriAttribute
. Установите пакет NuGet Microsoft.AspNet.Mvc.WebApiCompatShim через проводник пакетов или добавьте его непосредственно в файл project.json:
"dependencies": {
"Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-rc1-final"
}
Хотя он немного устарел, я обнаружил, что эта статья довольно хорошо объясняет некоторые изменения.
Привязка
Если вы хотите связать значения, разделенные запятыми, для массива (/ api / values? Ints = 1,2,3), вам, как и раньше, понадобится настраиваемое связующее. Это адаптированная версия решения Mrchief для использования в ASP.NET Core.
public class CommaDelimitedArrayModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext.ModelMetadata.IsEnumerableType)
{
var key = bindingContext.ModelName;
var value = bindingContext.ValueProvider.GetValue(key).ToString();
if (!string.IsNullOrWhiteSpace(value))
{
var elementType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0];
var converter = TypeDescriptor.GetConverter(elementType);
var values = value.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => converter.ConvertFromString(x.Trim()))
.ToArray();
var typedValues = Array.CreateInstance(elementType, values.Length);
values.CopyTo(typedValues, 0);
bindingContext.Result = ModelBindingResult.Success(typedValues);
}
else
{
// change this line to null if you prefer nulls to empty arrays
bindingContext.Result = ModelBindingResult.Success(Array.CreateInstance(bindingContext.ModelType.GetElementType(), 0));
}
return TaskCache.CompletedTask;
}
return TaskCache.CompletedTask;
}
}
Вы можете либо указать связыватель модели, который будет использоваться для всех коллекций в Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc().AddMvcOptions(opts =>
{
opts.ModelBinders.Insert(0, new CommaDelimitedArrayModelBinder());
});
}
Или укажите его один раз в вызове API:
[HttpGet]
public void Method([ModelBinder(BinderType = typeof(CommaDelimitedArrayModelBinder))] IEnumerable<int> ints)
person
Will Ray
schedule
29.04.2016
--
- person   schedule 29.04.2016