gpt4 book ai didi

asp.net-core - 将数组传递给 asp net core web api 操作方法 HttpGet

转载 作者:行者123 更新时间:2023-12-04 14:08:41 24 4
gpt4 key购买 nike

我正在尝试向我的操作方法发送一个整数数组,代码如下所示:

[HttpGet]
public async Task<IActionResult> ServicesByCategoryIds([FromQuery] int[] ids)
{
var services = await _accountsUow.GetServiceProfilesByCategoryIdsAsync(ids);
return Ok(services);
}

我这样调用方法: https://localhost:44343/api/accounts/servicesbycategoryids?ids=1&ids=2

但是当我调用这个方法时总是得到一个空数组,即使我在查询字符串中传递了 id。我正在使用 .net 核心 2.1。

我在谷歌上搜索的所有内容都表明这实际上是这样做的。 . .
我在这里缺少什么吗?

谢谢!

最佳答案

您可以将自定义模型绑定(bind)器和 id 实现为 URI 的一部分,而不是在查询字符串中。
您的端点可能如下所示:
/api/accounts/servicesbycategoryids/(1,2)

public class ArrayModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
// Our binder works only on enumerable types
if (!bindingContext.ModelMetadata.IsEnumerableType)
{
bindingContext.Result = ModelBindingResult.Failed();
return Task.CompletedTask;
}

// Get the inputted value through the value provider
var value = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName).ToString();

// If that value is null or whitespace, we return null
if (string.IsNullOrWhiteSpace(value))
{
bindingContext.Result = ModelBindingResult.Success(null);
return Task.CompletedTask;
}

// The value isn't null or whitespace,
// and the type of the model is enumerable.
// Get the enumerable's type, and a converter
var elementType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0];
var converter = TypeDescriptor.GetConverter(elementType);

// Convert each item in the value list to the enumerable type
var values = value.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => converter.ConvertFromString(x.Trim()))
.ToArray();

// Create an array of that type, and set it as the Model value
var typedValues = Array.CreateInstance(elementType, values.Length);
values.CopyTo(typedValues, 0);
bindingContext.Model = typedValues;

// return a successful result, passing in the Model
bindingContext.Result = ModelBindingResult.Success(bindingContext.Model);
return Task.CompletedTask;
}
}
然后在你的行动中使用它:
[HttpGet("({ids})", Name="GetAuthorCollection")]
public IActionResult GetAuthorCollection(
[ModelBinder(BinderType = typeof(ArrayModelBinder))] IEnumerable<int> ids)
{
//enter code here
}
从一门复数类(class)中学到了这一点:使用 ASP.NET Core 构建 RESTful API

关于asp.net-core - 将数组传递给 asp net core web api 操作方法 HttpGet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51300861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com