【问题标题】:What is the purpose of ASP.NET MVC Generic ControllerASP.NET MVC 通用控制器的目的是什么
【发布时间】:2013-11-15 20:51:32
【问题描述】:

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

【问题讨论】:

标签: c# asp.net-mvc


【解决方案1】:

您通常会创建一个通用类来抽象出您可以对一系列类型执行的操作,例如包含 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>
{

}

现在,当有人请求/Foo/Details/42 时,实体会从_repositorySet&lt;Foo&gt;() 中提取,而无需在FooController 中为此编写任何内容。

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

【讨论】:

  • e.ID 来自哪里?您应该使用具有ID 属性的类(例如BaseEntity)作为类型约束,而不仅仅是class。还是您的意思是实体框架的Find(object id) 方法?然后就是Find(id)
  • @Henk 这更像是一个原则示例,而不是准备复制粘贴代码,但你在这两点上都是正确的。已简化,谢谢。 :)
  • 我明白了。只是说以防有人实际上将其视为复制粘贴代码并防止混淆。 ;)
  • @CodeCaster :感谢您的回复。假设我有扩展 GenericController 的产品和客户控制器,如果请求像 /product/Details/42 或 /customer/Details/40 一样,那么将调用相同的 Details 操作方法并将有线结果返回给客户端,这将是一个问题.所以请指导我如何使用 GenericController 处理这种情况。
  • 为什么你认为会返回一个“有线”(你的意思是奇怪的吗?)结果?例如,Entity Framework 的DbContext.Set&lt;TEntity&gt;() 方法将返回Entity 类型实体的集合。他们可以这样做是因为每个实体只能在每个上下文中用作DbSet 一次,因此ProductController : GenericController&lt;Product&gt; 将调用yourContext.Set&lt;Product&gt;(),其返回的结果与yourContext.Products 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 2023-03-17
  • 2010-09-20
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多