【发布时间】:2010-09-07 06:22:16
【问题描述】:
假设我有两个对象 A 和 B,它们都有一个模型、一个视图和一个控制器。用户在 A 的视图中,然后按下按钮或调用 A 控制器中的动作的东西。此操作需要使用 B 模型。从 A 控制器中的操作,我应该直接调用 B 模型,还是应该通过 B 控制器与 B 模型交互?感谢阅读。
【问题讨论】:
假设我有两个对象 A 和 B,它们都有一个模型、一个视图和一个控制器。用户在 A 的视图中,然后按下按钮或调用 A 控制器中的动作的东西。此操作需要使用 B 模型。从 A 控制器中的操作,我应该直接调用 B 模型,还是应该通过 B 控制器与 B 模型交互?感谢阅读。
【问题讨论】:
你可以有一个 ViewModel 模式看到这个ASP.NET MVC ViewModel Pattern
【讨论】:
我猜你应该通过 B 控制器,因为 B 控制器可以访问 B 模型。
【讨论】:
如果对象之间存在关系(例如,问题和答案之间的多对多关系),您可以为对象 A 模型提供对象 B 模型的列表(反之亦然)
在对象 A 的模型类中,如下所示:
[Key]
[Display(Name = "Primary Key")]
public int QuestionId{ get; set; }
public virtual IList<Answer> Answers{ get; set; }
对于对象 B 也是如此(答案,它有一个问题的 IList)
这允许您将控制器中的对象 B(答案)称为 object.answers 或者您将其结构化。
您可能必须添加多对多关系OnModelBuild(),例如:
protected override void OnModelCreating(DbModelBuilder modelBuilder){
modelBuilder.Entity<Question>().HasMany(a => a.Answers).WithMany(b => b.Questions); }
【讨论】:
你不应该从 A 调用 B 控制器,反之亦然,因为这样你正在制作一个过于严格的应用程序!您应该始终解耦您的应用程序。 想象一下,您更改了 A 控制器正在使用的控制器 B 的工作方法,您将被卡住。 更好的方法是创建另一个层来处理所有这些,控制器应该只调用这些层, 例如: 业务层(BLL):拥有 UserBLL.cs -> 拥有方法: 验证(字符串用户名,字符串密码){}
你的控制器 A 和 B 都可以调用这个层(UserBLL.cs)并利用它。这样应用程序将是健壮的和解耦的。 最好创建另一个层,一个 Repository 层(用于 Crud 操作)。
【讨论】:
您可以创建一个包含两个模型的视图模型
Model A {} Model B{}
ViewModel AB{
Model A;
Model B;
}
//Custom model binder if you want to pass the ViewModel
public ActionResult SomeAction(Model A, Model B) {
//Logic
//pass the ViewModel(A,B) to the View
}
或者您可以将控制权传递给处理 B 模型逻辑的控制器。 我能想到的最后一个场景是创建一个 B 服务,它获取 A 模型并执行逻辑
【讨论】: