asp.net-core-1.0 - ASP.NET Core 1 Web API 模型绑定(bind)数组

标签 asp.net-core-1.0 asp.net5

如何在 ASP.NET Core 1 Web API(隐式或显式)中使用 GET 对来自 URI 的数组进行建模?

在 ASP.NET Web API pre Core 1 中,这有效:

[HttpGet]
public void Method([FromUri] IEnumerable<int> ints) { ... }

您如何在 中做到这一点? ASP.NET Web API 核心 1 (又名 ASP.NET 5 又名 ASP.NET vNext)?文档一无所有。

最佳答案

FromUriAttribute类结合了FromRouteAttributeFromQueryAttribute类。根据您的路由配置/发送的请求,您应该能够将您的属性替换为其中之一。
但是,有一个可用的垫片可以为您提供 FromUriAttribute类(class)。通过包资源管理器安装“Microsoft.AspNet.Mvc.WebApiCompatShim”NuGet 包,或直接将其添加到您的 project.json 文件中:

"dependencies": {
  "Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-rc1-final"
}
虽然它有点旧,但我发现 this article很好地解释了一些变化。
捆绑
如果您要为数组绑定(bind)逗号分隔值 ("/api/values?ints=1,2,3"),您将需要像以前一样的自定义活页夹。这是 Mrchief's solution 的改编版本用于 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 中指定用于所有集合的模型绑定(bind)器。 :
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)

关于asp.net-core-1.0 - ASP.NET Core 1 Web API 模型绑定(bind)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36794586/

相关文章:

c# - 使用 MVC6 和新身份设置 UserRole 管理

.net - 配置 .NET Core 以使用 x86 SDK

asp.net-core - NPoco 在 .net Core 中的使用

c# - 使用 .NET 5 调用受 Azure B2C 保护的 Web API

sql-server - .NET Core 对 SQL Server FILESTREAM 的支持

asp.net-mvc - 如何调试部署在 Azure 中的 ASPNET Core MVC 应用程序

asp.net - 在 Asp.Net Core App 中访问 Web.config 设置?

.net - VS 2015 : Profiling tools disabled in Performance Wizard

c# - linux 上的 ASP.NET CORE 5.0 TLS 1.2 问题但在 asp.net core 3.1 上正在运行

asp.net-core - 使用 asp.net core MVC 执行任何操作都会出现 404 错误