【问题标题】:Is it a good practice to call a method from a model in ASP.NET MVC从 ASP.NET MVC 中的模型调用方法是一种好习惯吗
【发布时间】:2011-10-21 14:29:24
【问题描述】:

过去,在编写代码时,我总是假设模型应该只包含由控制器填充的一堆自动属性。但是我最近遇到了这样的代码,想知道它是否对 MVC 有效:

public class SomeModel
{

    public BusinessInfo BusinessInfo { get; set; }
    public IList<BusinessService> BusinessServices { get; set; }
    public IList<BusinessHour> BusinessHours { get; set; }


    public BusinessService GetBusinessServiceByServiceId(int serviceId)
    {
        return BusinessServices.FirstOrDefault(businessService =>
                        businessService.Service.ServiceId == serviceId);
    }
} 

在这种情况下,像 GetBusinessServiceByServiceId 这样的方法是否合法?

编辑: 该模型用作 ASP.NET MVC 页面的强类型模型,因此它本质上类似于 ViewModel

【问题讨论】:

    标签: asp.net-mvc model-view-controller design-patterns architecture


    【解决方案1】:

    我会说不。如果ViewModel 需要BusinessService 对象,则应由Controller 提供它;通过 id 查找 BusinessService 对象是 Repository 类的工作,而 ViewModel 不是。此外,在给出的示例中,BusinessServices 应该在其构造函数中注入Controller,并通过接口而不是静态访问;你那里的代码示例很难测试。

    我个人使用 ViewModels 作为数据持有者,其中包含模型数据和属性,指示 View 是否应该显示某些元素。

    【讨论】:

    • 我通常也是这么想的,但是当您需要从视图中调用辅助方法时会发生什么。例如,视图包含一些 ID,您需要通过查询模型中的另一个对象来获取一些该 ID 的数据表单?应该在视图中声明还是在某个辅助类中声明为辅助方法?
    • ViewModel 应该包含View 需要显示的所有内容,所以你的意思是View 如何访问取决于(例如)用户选择的额外模型数据特定项目?如果是这样,您可以使用常规表单回发或对 Controller 方法的 AJAX 调用,该方法返回 View 需要的数据。如果没有,ViewModel 应在其属性中包含其他 ViewModels,以便 View 拥有所需的一切。
    【解决方案2】:

    虽然基本上不禁止在 ViewModel 中使用辅助方法,但听起来问题实际上出在您的视图中。

    MVC 模式 (IMO) 的目标之一是将尽可能多的逻辑留在控制器的操作中。

    同样,虽然在 ViewModel 中拥有辅助方法本身并不是一个坏习惯,但向 View 添加的逻辑比所需的要多。

    编辑:例如,在您的示例中,将 ViewModel 中的 BusinessServices IList 更改为 Dictionary 可能是一个更好的解决方案

    【讨论】:

      【解决方案3】:

      是的,在模型类中包含方法是完全有效且常见的。

      您可能正在考虑其他类型的课程。例如,大多数时候 ViewModel 只有属性而没有(或很少)方法。

      只有属性而没有方法的类通常被称为“数据传输对象”的 DTO,模型当然不属于这一类。

      【讨论】:

      • 抱歉,让我澄清一下,这个模型的作用类似于 ASP.NET MVC 强类型视图的 ViewModel。你的答案仍然适用吗?
      • 如果您在谈论 ViewModels,那么正如我在回答中暗示的那样,事情完全不同。您应该更新您的问题以更好地反映您的情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多