将一个整数数组传递给ASP.NET Web API?

7 浏览
0 Comments

将一个整数数组传递给ASP.NET Web API?

我有一个ASP.NET Web API(版本4)的REST服务,我需要传递一个整数数组。\n这是我的操作方法:\n

public IEnumerable GetCategories(int[] categoryIds){
// 从数据库中检索类别的代码
}

\n这是我尝试过的URL:\n/Categories?categoryids=1,2,3,4\n

0
0 Comments

问题的原因是需要将一个整数数组传递给ASP.NET Web API,但是默认情况下,Web API只能接收字符串作为参数。因此,需要找到一种方法来将字符串转换为整数数组。

解决方法是实现一个自定义的ActionFilter,命名为ArrayInputAttribute,并在该属性中重写OnActionExecuting方法。在该方法中,首先判断是否存在指定名称的参数。如果存在,就将该参数的值以字符串的形式获取到。然后,通过指定的分隔符将字符串分割为多个子字符串,并使用int.Parse方法将这些子字符串转换为整数,并存储在一个整数数组中。最后,将该整数数组赋值给指定名称的参数。

在应用该自定义属性时,需要在Web API的方法上使用[ArrayInput]标记,并指定参数名称和分隔符。在示例中,参数名称为"id",分隔符为分号。这样,当请求的URL为/api/Data/1;2;3;4时,Web API会将1、2、3和4转换为整数,并传递给Get方法的id参数。

需要注意的是,这个解决方法可能需要根据具体需求进行适当的修改和调整。有人提出,该解决方法中使用了int.Parse方法将字符串转换为整数,这是一种硬编码的方式,不够灵活。他认为,使用某人提出的解决方案会更好。

总之,通过实现一个自定义的ActionFilter,并在其中进行参数转换,可以实现将字符串转换为整数数组的功能,从而满足将整数数组传递给ASP.NET Web API的需求。

0
0 Comments

问题:如何将整数数组传递给ASP.NET Web API?

原因:ASP.NET Web API默认情况下不会正确绑定整数数组参数。

解决方法:使用自定义模型绑定器来绑定整数数组参数。

代码示例:

public IEnumerable GetCategories([ModelBinder(typeof(CommaDelimitedArrayModelBinder))]long[] categoryIds) 
{
    // do your thing
}
public class CommaDelimitedArrayModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        var key = bindingContext.ModelName;
        var val = bindingContext.ValueProvider.GetValue(key);
        if (val != null)
        {
            var s = val.AttemptedValue;
            if (s != null)
            {
                var elementType = bindingContext.ModelType.GetElementType();
                var converter = TypeDescriptor.GetConverter(elementType);
                var values = Array.ConvertAll(s.Split(new[] { ","},StringSplitOptions.RemoveEmptyEntries),
                    x => { return converter.ConvertFromString(x != null ? x.Trim() : x); });
                var typedValues = Array.CreateInstance(elementType, values.Length);
                values.CopyTo(typedValues, 0);
                bindingContext.Model = typedValues;
            }
            else
            {
                // change this line to null if you prefer nulls to empty arrays 
                bindingContext.Model = Array.CreateInstance(bindingContext.ModelType.GetElementType(), 0);
            }
            return true;
        }
        return false;
    }
}

然后可以通过以下方式传递整数数组:

`/Categories?categoryids=1,2,3,4`

ASP.NET Web API将正确绑定`categoryIds`数组。

注意事项:

- 该解决方法不适用于泛型列表(如`System.Collections.Generic.List`)。

- 如果需要泛型列表解决方案,请提出单独的问题。

备注:

- 对于使用较新版本的ASP.NET和MVC的用户,需要将`bindingContext.Model`的赋值改为`bindingContext.ModelMetadata.Model`。

- 对于ASP.NET Core,可以参考官方文档中的示例进行修正。

0
0 Comments

问题出现的原因是ASP.NET Web API在处理数组参数时,需要在参数前添加[FromUri]属性,并且在发送请求时需要以特定的格式传递参数。

解决方法是在参数前添加[FromUri]属性,并在发送请求时按照指定的格式传递参数。如果不知道数组中有多少个变量,可以在构建URL时根据实际数组中的元素数量来追加"&categoryids="。另外,在服务器端代码中,数组参数必须放在其他参数之前才能正常工作。

出现这个问题的原因是ASP.NET Web API在参数绑定时,只能从URI中获取“简单”类型的值,而int[]不属于“简单”类型。所以需要通过添加[FromUri]属性来告诉Web API从URI中获取数组参数的值。

对于.NET Core的使用者,解决方法是将[FromUri]属性改为[FromQuery]属性。

总结起来,ASP.NET Web API在处理数组参数时需要特殊的处理方式,通过添加[FromUri]属性来告诉Web API从URI中获取数组参数的值,并按照指定的格式传递参数。

0