【问题标题】:Good practice to have a data-only controller in MVC?在 MVC 中有一个纯数据控制器的好习惯?
【发布时间】:2012-07-10 01:34:35
【问题描述】:

我正在使用 ASP.NET MVC2,并且在各个领域都有各种控制器。

在其中许多中,我需要从数据库中包含的值列表中选择一个值;例如,选择产品或员工。

我目前正在考虑有一个控制器专门用于获取这些列表以用于下拉列表等。该控制器将简单地查询 DAL 并提供 JSON 对象,以便在需要它们的任何视图上加载 ajax 调用.

我唯一担心的是我的视图会同时从不同的控制器获取数据。

我有理由担心吗?有没有更好的方法来设置它,也许创建一个Product/Employee 类,特别是为了创建一个共享的强类型部分视图?

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller asp.net-mvc-2 application-design


    【解决方案1】:

    创建另一个类,作为控制器和数据访问代码之间的中间层。您现在可以从不同的控制器调用此类方法。

    public class ItemService()
    {
     public static List<Items> GetItems()
     {
        var items=yourRepositary.GetItems();
        return items;
     }
    }
    

    您现在可以从不同的控制器调用它

    public ActionResult GetItems()
    {
      var items=ItemService.GetItems();
      return Json(items,JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

    • 也许我误解了,但我不是要在任何需要它的控制器中复制ActionResult GetItems() 方法吗? (我承认这不是很多代码,所以也许不是问题)。我的想法是,如果我在许多控制器中重新创建此方法,为什么不在单个控制器中包含所有类似的方法,并且让每个需要 ajax 项目列表的视图都使用该控制器。
    • 当然。如果您正在寻找一种返回状态列表的方法,请使用带有 GetStates/Idnex 操作方法的状态控制器来返回所有状态。您可以从不同的视图调用它。但是,如果您想在不同的操作方法中获取相同的数据,请引入一个可重用的中间层,以便您可以从不同的操作方法调用它(一个返回 json/另一个返回 ViewModel 等......)
    • 嗯,好的。我明白你现在在说什么。谢谢。
    • 这基本上就是我解决问题的方法。我也用它来缓存——因为我的许多查找不经常更改,所以我在我的控制器和服务/数据库层之间放置了一个缓存对象。在我的情况下,缓存层特定于 Web 请求,这意味着我保持服务层纯净(来自数据库的实时)并允许我的网站缓存数据。有些人可能会争辩说这是“泄漏的抽象”,但我不同意。我的网站知道它需要什么数据以及如何缓存它。该服务知道从哪里获取数据并拥有自己的内部缓存规则。
    • @kingdango:完全同意缓存层是减少数据库调用的好方法。但这仍然取决于场景。如果数据不经常更改,缓存是必须的!
    【解决方案2】:

    恕我直言,最好的解决方案是创建一个自定义 ActionFilterAttribute,用您需要在视图上呈现的任何数据填充 ViewData 字典。然后,您可以为 ViewDataDictionary 创建扩展,以从视图中以类型安全的方式访问此信息,或者如果 ViewData 不包含数据则抛出异常(即提示您在控制器方法上方添加操作过滤器属性)。使用继承可能会让你进一步陷入混乱。

    【讨论】:

      【解决方案3】:

      另一种方法是使用实​​现此通用功能的基类控制器,然后从中继承其他具体控制器(与视图配对)。

      这种方法将支持存在大量不同列表的情况,或者需要动态构建列表以响应输入参数。

      ActionFilterAttribute 方法可能更适合静态列表更少、更多的情况。

      【讨论】:

        猜你喜欢
        • 2014-03-09
        • 1970-01-01
        • 2014-08-27
        • 2019-05-03
        • 2016-06-09
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多