假设我有两个对象,A和B,都有模型,视图和控制器。用户在A的视图中,然后按下一个按钮或调用A控制器中的操作的内容。此操作需要使用B模型。从A控制器中的动作,我应该直接调用B模型,还是应该通过B控制器与B模型进行交互?谢谢你的阅读。
答案 0 :(得分:2)
您可以使用ViewModel模式查看此ASP.NET MVC ViewModel Pattern
答案 1 :(得分:0)
我猜你应该通过B控制器,因为B控制器可以访问B模型。
答案 2 :(得分:0)
如果对象之间存在关系(例如,问题与答案之间存在多对多关系),则可以为对象A模型提供对象B模型列表(反之亦然)
在对象A的模型类中,这看起来像:
[Key]
[Display(Name = "Primary Key")]
public int QuestionId{ get; set; }
public virtual IList<Answer> Answers{ get; set; }
类似于对象B(Answers,有一个IList of Questions)
这允许您在控制器中将对象B(答案)称为object.answers
,或者您已将其结构化。
您可能需要添加多对多关系OnModelBuild()
,如:
protected override void OnModelCreating(DbModelBuilder modelBuilder){
modelBuilder.Entity<Question>().HasMany(a => a.Answers).WithMany(b => b.Questions); }
答案 3 :(得分:0)
你永远不应该从A或反之中调用B控制器,因为这样你就会制作一个过于严格的应用程序!你应该总是解耦你的申请。 想象一下,你改变了A控制器正在使用的控制器B的方法的工作,你将被卡住。 更好的方法是创建另一个处理所有这些的层,控制器应该只调用层, 例如: 业务层(BLL):具有UserBLL.cs - &gt;有一个方法: 验证(字符串用户名,字符串密码){}
您的控制器A和B都可以调用此层(UserBLL.cs)并使用它。这样,应用程序将是健壮的并且是分离的。 更好的是应该创建另一个层,一个Repository层(For Crud操作)。
答案 4 :(得分:0)
您可以创建包含两个模型的视图模型
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模型并执行逻辑