C# 在ASP.NET MVC中,当绑定到对象而不是特定类型时,为什么要将参数绑定为数组

C# 在ASP.NET MVC中,当绑定到对象而不是特定类型时,为什么要将参数绑定为数组,c#,asp.net,asp.net-mvc,model-binding,C#,Asp.net,Asp.net Mvc,Model Binding,我有一堆具有类似删除操作的控制器,所以我将其放入基类中。这是它以前的样子: public async Task<ActionResult> Delete(int id) { await apiClient.Delete(id); return new EmptyResult(); } 这很好,但是有些模型使用字符串作为键来代替int。因为API客户端由实体框架repo支持,它可以通过对象删除,所以我尝试了以下方法: p

我有一堆具有类似删除操作的控制器,所以我将其放入基类中。这是它以前的样子:

    public async Task<ActionResult> Delete(int id)
    {
        await apiClient.Delete(id);
        return new EmptyResult();
    }
这很好,但是有些模型使用字符串作为键来代替int。因为API客户端由实体框架repo支持,它可以通过
对象
删除,所以我尝试了以下方法:

    public async Task<ActionResult> Delete(object id)
    {
        await apiClient.Delete(id);
        return new EmptyResult();
    }
公共异步任务删除(对象id)
{
等待apiClient.Delete(id);
返回新的EmptyResult();
}

现在我得到一个绑定到
id
的单元素数组。单个元素是表示
项.Id
的字符串。为什么?为什么它是一个数组而不仅仅是元素?

我的猜测是,这实际上是传递给它的数据的默认格式,因为所有表单值都作为字符串传递给服务器,当存在名称冲突时,这些值可以作为该名称下的数组访问。实际上,字符串[]是所有提交值的默认类型,其他任何内容都涉及某种自动转换

例如,如果您有一个表单,其中有三个文本输入,它们都具有相同的名称“text”,那么浏览器将发送所有这三个文本输入,MVC将从一个名为“text”的字符串数组开始。由于控制器参数类型为“object”,它实际上无法对如何处理它做出任何明智的猜测,因此它只提供原始数组


另一方面,如果已知字段类型为string,那么它将它们组合成一个逗号分隔的列表;您可以通过将类型设置为“string[]”来避免这种不必要的连接步骤。如果参数类型为“int”,它将尝试将字符串值转换为整数。如果参数类型为“bool”,它将尝试将字符串解释为布尔值。因此,字符串数组实际上是普通值,它是接收特殊转换的所有其他对象。

,因为您已将其声明为
对象。模型绑定器无法知道您可能传递给它的内容(
int
string
double[]
等),因此它被初始化为字符串数组,以便能够保存所有数据posibilities@StephenMuecke可以我可以只提取第一个/单个元素并将其传递给apiClient吗?或者在某些情况下可能会出现这种情况吗?因为您只回发单个值,所以可以将其设置为
string id
,这样它就不是数组了。如果您的方法始终接受
对象
,则可以使用
.Delete((对象)id)
    public async Task<ActionResult> Delete(object id)
    {
        await apiClient.Delete(id);
        return new EmptyResult();
    }