我有一堆具有类似删除操作的 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/