从不同的模型和控制器在一个视图中加载值

时间:2015-07-20 11:53:18

标签: c# asp.net-mvc asp.net-mvc-4 kendo-ui telerik

我有一个视图,我用不同的模型和不同的控制器调用部分视图。 部分视图包含一个网格,该网格使用主视图的pk来填充自身。 如何在一个方法中加载两个模型值?

此致

2 个答案:

答案 0 :(得分:0)

需要调用多个控制器通常是设计不佳的标志。一个控制器应该调用业务(或其他一些抽象)层的两个独立部分来获取两组模型数据。如果做不到这一点,一个控制器将需要调用另一个控制器来获得模型的一部分。

然后,您可以将这两个模型组合成一个视图模型,该模型可以传递到主视图。然后主视图将部分视图传递给它感兴趣的整个模型的一部分。

答案 1 :(得分:0)

您应该考虑将项目拆分为多个层。您已经知道控制器和视图层,现在添加另一个名为ViewModel的层。然后在每个视图模型中实现容器以满足相关和不相关的内容。例如:

[HttpGet]
public void ViewModel1(){
   public ViewModel1(){
      using(var db = new CustomerEntities()){
          Customers = db.Customers.Where(
              p=>p.isActive = true &&    
              p.hasOrder=true && 
              p.AR > 0);
      }
   }
   public Customer SelectedCustomer {get;set;}
   public IEnumerable<Customer> Customers {get;set;}
   public ViewModel2 VMCustomerBilling {get;set;}
   public ViewModel3 VMCustomerOrders {get;set;}

   public void Post(){
        VMCustomerBilling = new ViewModel2(SelectedCustomer);
        VmCustomerOrders = new ViewModel3(SelectedCustomer);
   }
}

[HttpPost]
 public void ViewModel1(ViewModel1 vm){
   if(ModelState.IsValid){
      vm.Post();
   }
   return View(vm);
 }

这称为包含,因为您包含其他半相关内容。 ViewModel1将显示当前客户(例如)。您可以将“结算和订单”信息保留为空,直到回发后指示选择了哪个客户。这在ViewModel的Post方法中显示,对order表执行相同的操作。

在视图中,您只需添加“结算”和“订单”视图的部分视图,在主视图中只显示内容。