【问题标题】:Should I always use a view model or is it ok to use ViewData?我应该始终使用视图模型还是可以使用 ViewData?
【发布时间】:2015-07-27 07:46:29
【问题描述】:

您认为什么时候使用 ViewData 优于视图模型?

我在几个主要视图中有完全相同的局部视图。我想控制部分视图的呈现方式,但我也希望部分视图只接受一个视图模型,它是一个记录集合,只是一个纯 IEnumerable<> 对象。我宁愿避免从主视图发送完整的视图模型对象,因为它还包含许多不同的属性、对象,用于控制分页、排序、过滤等。

因此问题是我应该为局部视图创建另一个视图模型还是可以使用 ViewData?我在某些地方读到使用ViewData 是一种非常糟糕的做法。

使用查看数据,我可以简单地传递这样的要求详细信息:

@{
    ViewDataDictionary vd = new ViewDataDictionary
    {
        new KeyValuePair<string,object>("WithDelete", Model.WithDelete),
        new KeyValuePair<string,object>("WithRadarCode", Model.WithCode)
    };
}

// ...

@if (Model != null) {
    Html.RenderPartial("_ListOfRecordingsToRender", Model.recordingViewModel, vd);
}

目前正在整理中。

我担心的是,目前这个*.recordingViewModel 在我的项目中有很多不同的变化,因为创建/编辑、列出、记录记录细节等的不同模型。我觉得它可能开始变得太混乱了如果我为每个动作制作视图模型,我的项目。

你怎么看。请您就该特定问题提出建议。谢谢

【问题讨论】:

    标签: asp.net-mvc viewdata


    【解决方案1】:

    我认为您应该坚持使用ViewModel,您的ViewModel 是定义您对视图的要求的类。

    我这样做的原因是,从长远来看,它将更易于维护。使用 ViewBag 时,它是一个 dynamic 类,因此在您看来,您应该检查 ViewBag 属性是否存在(并且可能导致诸如拼写错误之类的愚蠢错误),例如:

    if(ViewBag.PropertyName != null)
    {
        // ViewBag.PropertyName is a different property to ViewBag.propertyName
    }
    

    这种类型的代码会让你的视图变得非常混乱。如果您使用强类型模型,您应该能够将大部分逻辑放在您的控制器中,并保持视图尽可能干净,这在我的书中是一个巨大的优势。

    你也会最终(如果你使用ViewBag)试图在某个时候维护它并挣扎。您正在删除 C# 的一个优点,它是一种强类型语言! ViewBag 不是强类型的,你可能认为你传递了一个 List&lt;T&gt; 但你可能只是传递了一个 string

    最后一点,您还将失去 Visual Studio 中的任何智能感知功能。

    我觉得如果我为每个动作制作视图模型,我的项目可能会开始变得过于混乱。

    在控制器中将所有内容分配给ViewBag 会不会很麻烦?如果它是 ViewModel,您可以将其发送到“映射”类以将您的 DTO 映射到您的视图。

    而不是这个:

    // ViewModel
    var model = new CustomViewModel()
    {
        PropertyOne = result.FirstResult,
        PropertyTwo = result.SecondResult,
    }
    //ViewBag
    ViewBag.PropertyOne = result.FirstResult;
    ViewBag.PropertyTwo = result.SecondResult;
    

    你可以这样做:

    var mapper = new Map();
    var model = mapper.MapToViewModel(result);
    

    *您显然需要为映射类提供一个实现,例如Automapper

    我还希望局部视图只接受一个视图模型,它是一个记录集合,只是一个纯 IEnumerable 对象。我宁愿避免从主视图发送完整的视图模型对象,因为它还包含许多不同的属性、对象,用于控制分页、排序、过滤等。

    没关系,只需创建一个具有IEnumerable&lt;T&gt; 属性的视图模型。在我看来,您应该尝试在所有场景中使用强类型 ViewModel

    【讨论】:

    • 我同意。总的来说,使用视图模型也是我最喜欢的方式。
    • 很好的答案,一直都是视图模型。
    • ViewBag 在某些情况下可能有用,但我宁愿避免使用它。你一看到ViewBag 就知道它是一种即时的代码味道。
    • @JamieRees 嗨。感谢您的快速回答。好的,我要更改代码。我没有遵循这一点:“您可以将其发送到'映射'类以将您的 DTO 映射到您的视图”。我不明白映射 DTO 和“映射”是什么意思。我可能在这里错过了一些简单的东西......
    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 2016-12-05
    • 2012-02-05
    • 2012-02-09
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多