关于MVC的简单问题

时间:2010-09-07 06:22:17

标签: model-view-controller

假设我有两个对象,A和B,都有模型,视图和控制器。用户在A的视图中,然后按下一个按钮或调用A控制器中的操作的内容。此操作需要使用B模型。从A控制器中的动作,我应该直接调用B模型,还是应该通过B控制器与B模型进行交互?谢谢你的阅读。

5 个答案:

答案 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模型并执行逻辑