使用开放泛型类型在控制器上创建操作方法

时间:2015-11-12 18:38:02

标签: c# asp.net asp.net-mvc asp.net-mvc-4 generics

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

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

    }
}

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

2 个答案:

答案 0 :(得分:4)

不,这是不可能的。为了基于请求主体调用动作,有什么称为模型绑定器,它指出应如何构造请求中的数据以适合动作方法的参数。没有具体的类型,模型绑定器没有指导。

<强>更新

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

但是,由于调用动作的方式,因此无法执行任何操作。直到MVC可以确定它应该作为参数传递给它时才能调用该动作,并且如果不检查请求是否有效,它就不能这样做。为了确定请求中是否存在可用作参数的内容,MVC必须知道需要将哪种内容传递到 first 中。这就是为什么你不能有一个通用的行动。如果没有MVC事先知道它处理的是什么类型,它就无法弄清楚如何处理请求。

答案 1 :(得分:2)

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

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

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

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