Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC通用控制器的用途是什么_C#_Asp.net Mvc - Fatal编程技术网

C# ASP.NET MVC通用控制器的用途是什么

C# ASP.NET MVC通用控制器的用途是什么,c#,asp.net-mvc,C#,Asp.net Mvc,我是asp.NETMVC的新手。我听说了ASP.NET MVC通用控制器这个词,谁能简单地解释一下它是什么?我以前使用过默认控制器,但现在我希望能够可视化ASP.NET MVC通用控制器的用途。如果有人能够解释开发人员必须考虑使用ASP.NET MVC通用控制器的情况,这将非常有帮助。关于如何实现它的概念和代码将受到极大的赞赏。感谢您通常创建一个泛型类来抽象您可以对一系列类型执行的操作,例如,包含ID的实体框架模型。在这种情况下,您可以将所有重复代码移动到基类中 对于MVC控制器,通用基本控制器

我是asp.NETMVC的新手。我听说了ASP.NET MVC通用控制器这个词,谁能简单地解释一下它是什么?我以前使用过默认控制器,但现在我希望能够可视化ASP.NET MVC通用控制器的用途。如果有人能够解释开发人员必须考虑使用ASP.NET MVC通用控制器的情况,这将非常有帮助。关于如何实现它的概念和代码将受到极大的赞赏。感谢

您通常创建一个泛型类来抽象您可以对一系列类型执行的操作,例如,包含ID的实体框架模型。在这种情况下,您可以将所有重复代码移动到基类中

对于MVC控制器,通用基本控制器可能如下所示:

public abstract class GenericController<T> 
    where T : class
{
    public virtual ActionResult Details(int id)
    {
        var model = _repository.Set<T>().Find(id);
        return View(model);
    }
}
public class FooController : GenericController<Foo>
{

}
公共抽象类GenericController
T:在哪里上课
{
公共虚拟操作结果详细信息(int id)
{
var model=_repository.Set().Find(id);
返回视图(模型);
}
}
以及这样的实现:

public abstract class GenericController<T> 
    where T : class
{
    public virtual ActionResult Details(int id)
    {
        var model = _repository.Set<T>().Find(id);
        return View(model);
    }
}
public class FooController : GenericController<Foo>
{

}
公共类FooController:GenericController
{
}
现在,当有人请求
/Foo/Details/42
时,实体将从
\u存储库
集合()
,而无需在
FooController
中写入任何内容


通过这种方式,您可以创建一个基本的“CRUD”控制器,使您可以轻松地通过创建、读取、更新和删除新模型的操作来扩展应用程序。

检查此项,至少解释您在什么上下文中听到过此项操作,最好是使用链接,以便我们可以尝试解释其含义。
e.ID
来自哪里?您应该使用具有
ID
属性的类(例如
BaseEntity
)作为类型约束,而不仅仅是
class
。还是说实体框架的
Find(objectid)
方法?然后就是
Find(id)
@Henk这更像是一个原理的例子,而不是准备复制粘贴代码,但这两点你都是对的。我已经简化了,谢谢。:)我理解。以防有人将其视为复制粘贴代码,并防止混淆。;)@主持人:谢谢你的回复。这将是一个问题,假设我有扩展GenericController的产品和客户控制器,如果请求像/product/Details/42或/customer/Details/40一样出现,那么将调用相同的Details操作方法,并将有线结果返回给客户机。所以,请指导我如何使用GenericController处理这种情况。为什么您认为会返回一个“有线”(您的意思是奇怪?)结果?例如,实体框架的
DbContext.Set()
方法将返回类型为
Entity
的实体的集合。它们可以这样做,因为每个实体只能作为每个上下文的
DbSet
使用一次,因此
ProductController:GenericController
将调用
yourContext.Set()
,它将返回与
yourContext.Products
相同的结果。