zoukankan      html  css  js  c++  java
  • MVC传递Model之TempData、ViewData、ViewBag差别及用途

    MVC使用过程中常常会用到TempData、ViewData、ViewBag三种方式,这三种什么差别呢?
    TempData:默认存储于Session中,可通过继承ITempDataProvider接口改变。
    生命周期:经过一次Controller传递就失效,即View读取一次后相应的TempData即从TempData集合中删除,只是假设TempData未被View读取之前,其值可在Controller之间传递。PS:假设你不想TempData使用后就删除,您能够通过TempData.Peek(“KEY”)来长期保存。假设是仅仅想再保存一次,再读取一次后再删除则要使用TempData.Keep(“KEY”),这样假设再被读取又会再次标记删除。

    ViewData:默认存储为Dictionary键值对
    生命周期:仅对当前View有效。

    ViewBag:不再是以键值对形式存放。它以dynamic类型存放
    生命周期:同ViewData一样,仅对当前View有效
    PS:ViewBag可看成是对ViewData的封装,只是ViewBag不能够作为扩展方法的參数,由于扩展方法的參数类型必须明白

    除了以上三种方式以外,还有ViewModel、PartialView和Tuple

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

    长处:
    ● 把多个model放到一个View Model中
    ● 有智能提示
    ● 安全性:Domain Model被隐藏
    ● 当Domain Model有变化,不须要改动视图非常多。仅仅须要改动相应的View Model就能够
    ● 在Domain Model和View之间实现了松耦合

    PartialView:对于哪些须要反复使用的视图部分,提取出来作为部分视图。

    长处:
    ● 方便反复使用
    ● 仅仅更新主视图的某个部分
    缺点:
    ● 多过的使用影响可读性

    Tuple:.NET 4.0推出的。是一个有序的、不可变的、固定大小的、同意存放多种类型的类。

    适合传递一些”小数据”。假设不想在ASP.NET MVC中创建View Model,可用Tuple来替代。

    长处:
    ● 提供了一种不须要创建View Model而传递Model的方式。
    缺点:
    ● 大小被限制:最多仅仅能存放8组数据。


    ● 值以item1, item2…来传递。非常难确定item1, item2…究竟代表哪组数据。
    ● 智能提示不理想
    样例:

    □ HomeController

            public ActionResult TupleDemo()
            {
                var allModels = new Tuple<List<Course>, List<Teacher>, List<Student>>(_repository.GetCourses(),
                    _repository.GetTeachers(), _repository.GetStudents()) {};
                return View(allModels);
            }

    □ Home/TupleDemo.cshtml

    @model Tuple <List <MvcApplication1.Models.Course>, List <MvcApplication1.Models.Teacher>, List <MvcApplication1.Models.Student>>    

    下拉框遍历课程:

    @foreach (var course in Model.Item1)

    ajax请求老师课程表和学生上课表:

    @Html.Raw(Json.Encode(Model.Item2)) 
    @Html.Raw(Json.Encode(Model.Item3))

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

  • 相关阅读:
    kmp 算法
    jdk 和 cglib 的动态代理
    RestTemplate工具类
    bat脚本切换多个工程的分支
    字符串的左旋转
    输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。
    枚举类型在JPA中的使用
    拾遗
    YAML DEMO
    kiali 1.26 anonymous策略修改为token
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5278494.html
Copyright © 2011-2022 走看看