c# - ASP.NET MVC中,为什么绑定(bind)对象时参数绑定(bind)为数组而不是特定类型

标签 c# asp.net asp.net-mvc model-binding

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

    public async Task<ActionResult> Delete(int id)
    {
        await apiClient.Delete(id);
        return new EmptyResult();
    }

在 View 中有一个原始链接指向:

/Items/Delete?Id=" + item.Id

这很好用,但是有些模型使用字符串代替 int 作为键。由于 API 客户端由可以通过 object 删除的 Entity Framework 存储库支持,我只是尝试了这个:

    public async Task<ActionResult> Delete(object id)
    {
        await apiClient.Delete(id);
        return new EmptyResult();
    }

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

最佳答案

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

例如,如果您有一个包含三个文本输入的表单,它们都具有相同的名称“text”,浏览器将发送这三个文本,而 MVC 将从一个名为“text”的字符串数组开始。由于 Controller 参数类型是“object”,它真的无法对如何处理它做出任何聪明的猜测,所以它只是给你原始数组。

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

关于c# - ASP.NET MVC中,为什么绑定(bind)对象时参数绑定(bind)为数组而不是特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32630296/

相关文章:

c# - 如何使用 ASP.NET 跟踪下载?

c# - 我可以迁移到 Entity Framework 中没有迁移的情况下创建的数据库吗?

ios - 上传图像时对象引用未设置为 object.postmethod POST 文件名文件的实例,但**与 Android 代码一起正常工作**

c# - ASP.net MVC Entity Framework 更新多对多关系

c# - 更快地创建测试方法

c# - 在 Elasticsearch 和嵌套中传递和比较具有不同时区的日期时间值

asp.net-mvc - 我们应该清理传递给操作方法的非字符串参数吗?

javascript - 如果使用 GET 方法,AJAX 请求无法将 DateTime 传递到服务器

c# - 组名在中继器 asp.net 内的多个单选按钮中不起作用

asp.net - 如何更改 web.config 文件的名称并让 IIS 从新命名的文件中读取?