数据从DAL传输到MVC View

时间:2013-08-28 14:35:20

标签: c# asp.net-mvc

ASP.NET MVC4

我有业务层DLL,它与我的DAL通信并检索如下类:

public class ProductionParameter
    {
        public string CompanyCode { get; set; }
        public string UnitCode { get; set; }
        public string ItemDescriptionLocal { get; set; }
        public string ItemDescriptionEnglish { get; set; }
        public string ConsumedItemDescriptionLocal { get; set; }
        public string ConsumedItemDescriptionEnglish { get; set; }
        public string LotCategory1Description { get; set; }
        public string LotCategory2Description { get; set; }
        public string LotCategory3Description { get; set; }
        public string LotCategory1Code { get; set; }
        public string LotCategory2Code { get; set; }
        public string LotCategory3Code { get; set; }
        public string LineCode { get; set; }
        public string LineCodeDisplay { get; set; }

        public List<Pallet> PalletsProduced { get; set; }

    }

我的控制器获取上述信息,但我的View不需要以上所有内容。

例如,假设我得到3个生产参数类,每个类有20个托盘。这意味着每个生产参数都有20个托盘。

我想向我的MVC展示查看每个生产参数的合并数据。

我是如何正确地做到的?

标准案例

我是否在模型中创建了一个具有视图所需信息的类,然后在@model指令中定义该类?

AJAX:

如果我想通过AJAX进行更改,会有什么变化?我的AJAX调用将返回合并数据或完整数据,让AngularJS或Jquery在客户端进行整合?

2 个答案:

答案 0 :(得分:4)

  

标准案例:

     

我是否在模型中创建了一个具有我需要的信息的类   查看然后在@model指令中定义这个类?

是的,这正是你应该做的。您只能使用视图所需的属性来定义视图模型。然后,您的控制器操作会将一个或多个域模型聚合到视图模型中,并将其传递给视图。

  

AJAX:

     

如果我想通过AJAX进行更改,会有什么变化?我的AJAX调用将返回   合并数据或完整数据并让AngularJS或Jquery   在客户端进行合并?

您应该始终从包含仅包含所需信息的控制器操作返回一个视图模型到客户端。这样,您不仅可以优化带宽和网络使用,还可以让客户的生活更加轻松。他们不再需要进行复杂的数据查询和投影,而是直接使用以视图模型的形式提供给他们的信息。

结论:您的控制器操作应始终从视图中获取特定设计的视图模型并将其传递给视图。

答案 1 :(得分:1)

您可以使用ViewModel将您的业务逻辑与View分开.A ViewModel表示您希望在视图/页面上显示的数据。

假设您有ProductionParameterclass,其中包含以下属性:

public class ProductionParameter
{
   public string CompanyCode { get; set; }
   public string UnitCode { get; set; }
   public string ItemDescriptionLocal { get; set; }
   public string ItemDescriptionEnglish { get; set; }
   public string ConsumedItemDescriptionLocal { get; set; }
   public string ConsumedItemDescriptionEnglish { get; set; }
   public string LotCategory1Description { get; set; }
   public string LotCategory2Description { get; set; }
   public string LotCategory3Description { get; set; }
   public string LotCategory1Code { get; set; }
   public string LotCategory2Code { get; set; }
   public string LotCategory3Code { get; set; }
   public string LineCode { get; set; }
   public string LineCodeDisplay { get; set; }
   public List<Pallet> PalletsProduced { get; set; }
}

视图模型与域模型的不同之处在于,视图模型仅包含要在视图上使用的数据(由属性表示)。

假设您想在视图上仅显示以下属性,那么您的ViewModel可以是

 public class ProductionParameterViewModel
 {
    public string CompanyCode { get; set; }
    public string UnitCode { get; set; }
    public string ItemDescriptionLocal { get; set; }
    public string ItemDescriptionEnglish { get; set; }
    public string ConsumedItemDescriptionLocal { get; set; }
    public string ConsumedItemDescriptionEnglish { get; set; }
    public string LineCodeDisplay { get; set; }
    public List<Pallet> PalletsProduced { get; set; }
  } 

然后,在您的视图中,您可以按如下方式使用它:

@model MyProject.ViewModels.ProductionParameterViewModel

修改

如果您有两个模型,那么您可以将它们放在一个模型中,如下所示:

public class ViewModel1
{

}

public class ViewModel2
{

}

public class MyAggregateModel
{
   public ViewModel1 Model1 { get; set;}

   public ViewModel2 Model2 { get; set;}
}