【问题标题】:Data travel from DAL to MVC View数据从 DAL 传输到 MVC 视图
【发布时间】:2013-08-28 14:35:19
【问题描述】:

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; }

    }

我的控制器获得了上述信息,但我的视图不需要上述所有信息。

例如,假设我得到 3 个生产参数类,每个类有 20 个托盘。即每个生产参数生产20个托盘。

我想向我的 MVC View 显示每个生产参数的合并数据。

我如何正确地做到这一点?

标准箱:

我是否在 Models 中创建一个包含视图所需信息的类,然后在 @model 指令中定义该类?

AJAX:

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

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    标准箱:

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

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

    AJAX:

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

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

    结论:您的控制器操作应始终采用专门设计的视图模型并将其从视图传递到视图。

    【讨论】:

    • 我明白了。所以即使在 AJAX 中,我也不应该让客户知道比他需要的时间更多的数据。如果我需要对每个聚合进行分析,那么这每次都是一个新的 AngularJS / Jquery 调用?
    • 不,永远不要让客户端知道所有数据。只让它知道它需要什么。如果您需要为不同的聚合进行多次 AJAX 调用,您可以考虑将这些聚合作为初始视图模型的一部分返回。这将避免您发送多个 AJAX 请求的成本。请记住,最好发出 1 个返回较大负载的 AJAX 请求,而不是返回较小负载的多个 AJAX 请求。这是必须遵循的黄金经验法则。我见过有人在 javascript 的 for 循环中发出 AJAX 请求,这太糟糕了。
    • 再次感谢,如果我想在一页中返回具有不同数据的 2 个 ViewModel 类该怎么办?例如,我想返回生产汇总数据和销售汇总数据..
    • 不,您永远不会返回 2 个视图模型。您总是返回 1 个视图模型。在您的情况下,此视图模型可能包含 2 个属性:一个包含聚合的生产数据,另一个用于销售数据,以便客户可以直接访问它们。
    • 这意味着我创建了一个 ViewModel 类,其中包含其他 2 个它们之间不相关的类?这可以永远持续下去吗?我的意思是,如果我有一个包含 5 个不同数据组的复杂视图,我会这样做吗?一个视图模型类有 5 个不同的类?
    【解决方案2】:

    您可以使用ViewModels 将您的业务逻辑与视图分开。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;}
    }
    

    【讨论】:

    • 不错。如果我想返回 2 组数据我应该怎么做?我的意思是 2 个不同的 ViewModelClasses?
    • 我明白了。所以我将 MyAggregateModel 传递给我的视图,一切都很好..这也适用于 Ajax 的方式
    • @e4rthdog 是的,其他一切都保持不变。
    猜你喜欢
    • 2013-09-28
    • 2018-10-15
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多