【问题标题】:Do I need a separate Model/Controller for each scenario, or can I reuse a single Model/Controller for multiple scenarios?我是否需要为每个场景使用单独的模型/控制器,或者我可以为多个场景重用一个模型/控制器?
【发布时间】:2016-04-22 16:17:08
【问题描述】:

我的主页模型/视图/控制器(配置页面的初始状态)工作正常。

不过,我还需要响应用户在页面上所做的更改(从选择中选择一个选项、选中一个复选框等),但还没有实现。

也许我遇到问题的原因是我试图重用我的“主页”模型,该模型不仅包含页面初始化所需的内容,还包含其他一些内容。比如我的模型:

public class HomeModel
{
    public DataTable Units { get; set; }
    public DataTable Reports { get; set; }
    public DataTable UnitReportPairEmailVals { get; set; }
    public DataTable UnitReportPairGenerateVals { get; set; }
    . . .
}

...包含页面最初需要的东西(“Units”和“Reports”以及由省略号表示的东西),但也包含稍后才需要的东西(显示的另外两个)。

我想知道我在取回这些数据(通过对 HomeController 中的另一个方法的 Ajax 调用)方面的问题是否至少部分是因为我应该为 Ajax 调用使用单独的模型和控制器。

所以我想知道:模型/控制器扩散是代码异味/反模式,还是必要的?我应该创建另一个模型吗:

public class AJAXModel
{
    public DataTable UnitReportPairEmailVals { get; set; }
}

...以及它对应的独立Controller?

如果我有一个复杂的Model,用在各种场景中,好像每次我把一个model作为Action的返回值(结果)传回来,也会传回来很多多余的/未填充的东西(只有我当时感兴趣的成员被填充到控制器中,因此传回了很多空/空成员)。

所以我的问题是,我应该为每个“用例”创建单独的模型/控制器,还是可以 - 甚至更好 - 将一堆东西组合成一个模型/控制器对?

【问题讨论】:

  • 一种常见的方法是制作一些特定的ViewModel 对象以传递给您的客户端-然后可能使用自动映射器将常见但复杂的Model 映射到场景-具体ViewModel。我认为没有理由在您的情况下创建新的 ControllerModel 类。
  • 如果你不改变视图,你为什么要考虑创建另一个控制器?您不是指现有控制器中的另一个 Action 吗?
  • 重用复合模型似乎更像是一种反模式,而不是模型的扩散。另外,我对在模型中使用 DataTable 有点怀疑。
  • 嗯...MVC 是产品,但 MVVM 是技术(出于本讨论的目的)...它非常适合您的场景。通常,您的 ViewModels 将是普通的 CLR 类型 - 不是 EF 或以任何方式支持数据。
  • 在 MVC 6 的框中有一个适度的自动映射器 - 使这种方法非常简单 - 只要您的属性名称在 ModelsViewModels 之间排列。旧版本...我不知道...但我知道那里有很好的自动映射器。

标签: c# ajax asp.net-mvc


【解决方案1】:

没有令人信服的理由将Model 限制为单个Controller 或期望Controller 只有一个Model。你可以用一个Controller 编写整个应用程序(顺便说一句,这真是个坏主意)。

通常,除法是合乎逻辑的...在一个控制器中与同一组Models 对话的一组动作。当您像其他任何东西一样打开源文件时,更多的是防止您的大脑融化。

您通常有多个Views,并且它们倾向于在您的控制器中使用Actions 进行名称匹配...但这不是严格执行的。

当您觉得在 View 中获得的数据超出必要时,可以通过将 Model 映射到 ViewModel 以简化 View 中的代码来简化此操作。是的,这是 MVVM……再一次……处理View 中更简单的对象时,大脑不会那么痛苦。

您可以手动映射 Controller 中的对象,或者您可以使用自动映射器来执行此操作。有很多可供选择......它们使 MVVM 变得更简单。你不一定需要一个。它们很有帮助。

【讨论】:

  • 我想知道“Florida Hill Country”* 成为佛罗里达岛需要多长时间。 *顺便说一句,虽然我去过圣奥古斯丁,但我确实知道佛罗里达的任何地方都不比众所周知的烙饼更平坦。
  • 确实——到处都是可怕的命题。我们在 110 英尺……至少还能再用 10 年?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2016-02-13
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多