该类FromUriAttribute
结合了FromRouteAttribute
和FromQueryAttribute
类。根据您的路由配置/发送的请求,您应该能够将您的属性替换为其中之一。
但是,有一个可用的垫片可以为您提供FromUriAttribute
课程。通过包资源管理器安装“Microsoft.AspNet.Mvc.WebApiCompatShim”NuGet 包,或直接将其添加到您的 project.json 文件中:
"dependencies": {
"Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-rc1-final"
}
虽然它有点旧,但我发现这篇文章很好地解释了一些变化。
捆绑
如果您要为数组绑定逗号分隔值 ("/api/values?ints=1,2,3"),您将需要像以前一样的自定义活页夹。这是用于 ASP.NET Core的Mrchief 解决方案的改编版本。
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)