我有一个视图,我用不同的模型和不同的控制器调用部分视图。 部分视图包含一个网格,该网格使用主视图的pk来填充自身。 如何在一个方法中加载两个模型值?
此致
答案 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表执行相同的操作。
在视图中,您只需添加“结算”和“订单”视图的部分视图,在主视图中只显示内容。