【发布时间】: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。我认为没有理由在您的情况下创建新的Controller或Model类。 -
如果你不改变视图,你为什么要考虑创建另一个控制器?您不是指现有控制器中的另一个 Action 吗?
-
重用复合模型似乎更像是一种反模式,而不是模型的扩散。另外,我对在模型中使用
DataTable有点怀疑。 -
嗯...MVC 是产品,但 MVVM 是技术(出于本讨论的目的)...它非常适合您的场景。通常,您的
ViewModels将是普通的 CLR 类型 - 不是 EF 或以任何方式支持数据。 -
在 MVC 6 的框中有一个适度的自动映射器 - 使这种方法非常简单 - 只要您的属性名称在
Models和ViewModels之间排列。旧版本...我不知道...但我知道那里有很好的自动映射器。
标签: c# ajax asp.net-mvc