在具有打开泛型类型的控制器上创建操作方法

本文关键字:控制器 创建 操作方法 泛型类型 | 更新日期: 2023-09-27 18:21:39

我是否可以拥有ActionResult/JsonResult,它可以接受泛型类型的参数?即我想做这样的事情:

public class mycontroller : Controller
{
    public async Task<JsonResult> Add(T type)
    {
    }
}

其中CCD_ 1可以是我在模型中定义的任何类。对此有什么想法吗?

在具有打开泛型类型的控制器上创建操作方法

不,这是不可能的。为了根据请求体调用操作,有一种称为modelbinder的方法,它可以计算出如何构建请求中的数据以适应操作方法的参数。如果没有具体的类型,模型绑定器就没有指导。

更新

只是为了更好地解释一下。通常,在处理泛型时,必须显式地(在调用方法时使用<Type>语法)或隐式地(通过为泛型参数传入某个实例,即表示泛型类型就是该实例的类型)指定类型。

然而,由于行动的调用方式,两者都没有办法。在MVC能够确定应该将什么作为参数传递给它之前,不能调用该操作,并且在不检查将要工作的东西的请求的情况下,它不能这样做。为了确定请求中是否有可以用作参数的东西,MVC必须知道需要首先将什么样的东西传递到操作中。这就是为什么你不能有一个通用的行动。如果MVC事先不知道它在处理什么类型,它就无法弄清楚该如何处理请求。

MVC的模型绑定器需要将传入的表单字段(或JSON或XML数据或其他数据)映射到方法参数类型的属性。

换句话说,传入的{ "foo" : "bar" }要求public async Task<JsonResult> Add(Bar bar)中的Bar具有foo属性。

WebAPI不知道哪些类型具有foo属性。是的,它可以扫描bin目录中的所有程序集并找到"最合适"的类型,但给定上面的示例JSON和两个具有foo属性的类,哪一个是"最合适的",为什么?

你无法回答这个问题,MVC团队也不想回答,所以不,你的WebAPI/MVC控制器方法必须使用具体的参数类型。