zoukankan      html  css  js  c++  java
  • MVC到底使用哪种方式传递Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之间取舍

    在"MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple"中,体验了使用不同的方式传递多个Model,而ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple都可以用来传递Model,如何取舍呢?本篇主要包括:

      使用ViewData

    3


    ViewData是在ControllerBase中类型为ViewDataDictionary的属性,以键值对的方式存储,通过key来获取值。

    主要用途:
    ViewData和ViewBag的作用是一样的,只不过在早期的ASP.NET MVC版本(1和2)中,使用的是ViewData,后期的版本推出了ViewBag,它比ViewData有更多的优点,推荐使用ViewBag。

    优点:
    ● 方便:以键值对的方式把Model存放起来,再从控制器传递到视图。

    缺点:
    ● 单向传递:只能从控制器传递到视图。
    ● 只能存放当前请求下的Model:无法维持在多个请求下的Model,一旦页面跳转,ViewData的值就变成了null
    ● 只能存放"小数据":如果要传递"大数据",不推荐使用ViewData。
    ● 使用key获取的方式,可读性不如ViewBag。
    ● 没有智能提示
    ● 没有编译期错误检查

      使用ViewBag

    4


    ViewData是在ControllerBase中类型为dynamic的属性,是name/value形式的字典。dynamic类型是C# 4.0推出的一个类型,它使得在编译期不需要指明类型。

    主要用途:
    ● 以name/value的形式把Model存放起来,再从控制器传递到视图。视图的Title就是通过ViewBag.Title来设置的。


    优点:
    ● 方便
    ● 使用name获取对应的值,比ViewData使用key获取对应的值,来得更好。
    ● 不需要显式指明类型

    缺点:
    ● 单向传递:只能从控制器传递到视图。
    ● 只能存放当前请求下的Model:无法维持在多个请求下的Model,一旦页面跳转,ViewBag的值就变成了null
    ● 只能存放"小数据":如果要传递"大数据",不推荐使用ViewBag。
    ● 没有智能提示
    ● 没有编译期错误检查

      使用PartialView

    主要用途:
    对于哪些需要重复使用的视图部分,提取出来作为部分视图。

    优点:
    ● 方便重复使用
    ● 只更新主视图的某个部分

    缺点:
    ● 多过的使用影响可读性

      使用TempData

    5


    TempData在ControllerBase中类型为TempDataDictionary的属性,是键值对形式的字典,通过key来获取对应的值,在赋值的时候需要显式指明类型。和ViewData和ViewBag的不同之处在于:它可以跨controller,跨action来使用,其内部使用了Session机制。

    主要用途:
    可以用来传递一些非敏感类的数据,比如验证、错误信息等。

    优点:
    ● 跨controller,跨action

    缺点:
    ● 需要显式赋值,并需要判断是否为null以避免错误
    ● 没有智能提示

      使用ViewModel

    它是基于视图需求的Model,它可以把多个View Model以属性的方式合并到一个View Model中。

    优点:
    ● 把多个model放到一个View Model中
    ● 有智能提示
    ● 安全性:Domain Model被隐藏
    ● 当Domain Model有变化,不需要修改视图很多,只需要修改对应的View Model就可以
    ● 在Domain Model和View之间实现了松耦合

      使用Tuple

    Tuple是在.NET 4.0推出的,是一个有序的、不可变的、固定大小的、允许存放多种类型的类。

    主要用途:
    适合传递一些"小数据",如果不想在ASP.NET MVC中创建View Model,可用Tuple来替代。

    优点:
    ● 提供了一种不需要创建View Model而传递Model的方式。

    缺点:
    ● 大小被限制:最多只能存放8组数据。
    ● 值以item1, item2...来传递,很难确定item1, item2...到底代表哪组数据。
    ● 智能提示不理想

      总结

    ● 如果传递的是"小数据",我们想到ViewBag, ViewData。
    ● 如果基于View的Model,我们想到针对该View设计View Model。
    ● 如果视图的某个部分需要被重复使用,就把之提炼出来,成为一个Partial View。
    ● 当需要跨controller,跨action传递,我们想到TempData。
    ● 如果传递的是"小数据",又不想使用View Model,可以考虑Tuple。

    参考资料:
    How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC

  • 相关阅读:
    分布式系统理论基础
    分布式系统理论基础
    RPC框架实现
    分布式服务协调员zookeeper
    LSM Tree存储组织结构介绍
    协程 及 libco 介绍
    回顾2013——新的旅程
    从prototype beandefinition 谈 spring 的关闭流程和 prototype 的特性
    调研 中央空调 地暖 水暖
    物联网安全设计
  • 原文地址:https://www.cnblogs.com/darrenji/p/3829552.html
Copyright © 2011-2022 走看看