【问题标题】:Simple question about MVC关于MVC的简单问题
【发布时间】:2010-09-07 06:22:16
【问题描述】:

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

【问题讨论】:

    标签: model-view-controller


    【解决方案1】:

    你可以有一个 ViewModel 模式看到这个ASP.NET MVC ViewModel Pattern

    【讨论】:

      【解决方案2】:

      我猜你应该通过 B 控制器,因为 B 控制器可以访问 B 模型。

      【讨论】:

      • 你是什么意思,“只有访问权限?”没有理由必须这样。
      • 哎呀!删除了“仅”一词。
      【解决方案3】:

      如果对象之间存在关系(例如,问题和答案之间的多对多关系),您可以为对象 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); }
      

      【讨论】:

        【解决方案4】:

        你不应该从 A 调用 B 控制器,反之亦然,因为这样你正在制作一个过于严格的应用程序!您应该始终解耦您的应用程序。 想象一下,您更改了 A 控制器正在使用的控制器 B 的工作方法,您将被卡住。 更好的方法是创建另一个层来处理所有这些,控制器应该只调用这些层, 例如: 业务层(BLL):拥有 UserBLL.cs -> 拥有方法: 验证(字符串用户名,字符串密码){}

        你的控制器 A 和 B 都可以调用这个层(UserBLL.cs)并利用它。这样应用程序将是健壮的和解耦的。 最好创建另一个层,一个 Repository 层(用于 Crud 操作)。

        【讨论】:

          【解决方案5】:

          您可以创建一个包含两个模型的视图模型

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

          【讨论】:

            猜你喜欢
            • 2011-09-21
            • 1970-01-01
            • 2023-03-07
            • 1970-01-01
            • 1970-01-01
            • 2011-07-22
            • 2011-08-19
            • 2010-10-28
            • 1970-01-01
            相关资源
            最近更新 更多