1.使用ViewData

  ViewData 的是ControllerBase 的一个属性,是一个数据字典类型的,其实现代码如(这段代码来自asp.net MVC开源项目中源码)下:

Code
  1 public class ViewDataDictionary : IDictionary<string, object> {
  2 
  3         private readonly Dictionary<string, object> _innerDictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
  4         private object _model;
  5         private readonly ModelStateDictionary _modelState = new ModelStateDictionary();
  6 
  7         public ViewDataDictionary()
  8             : this((object)null) {
  9         }
 10 
 11         [SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors",
 12             Justification = "See note on SetModel() method.")]
 13         public ViewDataDictionary(object model) {
 14             Model = model;
 15         }
 16 
 17         [SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors",
 18             Justification = "See note on SetModel() method.")]
 19         public ViewDataDictionary(ViewDataDictionary dictionary) {
 20             if (dictionary == null) {
 21                 throw new ArgumentNullException("dictionary");
 22             }
 23 
 24             foreach (var entry in dictionary) {
 25                 _innerDictionary.Add(entry.Key, entry.Value);
 26             }
 27             foreach (var entry in dictionary.ModelState) {
 28                 ModelState.Add(entry.Key, entry.Value);
 29             }
 30             Model = dictionary.Model;
 31         }
 32 
 33         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
 34         public int Count {
 35             get {
 36                 return _innerDictionary.Count; 37             } 38         } 39  40         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] 41         public bool IsReadOnly { 42             get { 43                 return ((IDictionary<string, object>)_innerDictionary).IsReadOnly; 44             } 45         } 46  47         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] 48         public ICollection<string> Keys { 49             get { 50                 return _innerDictionary.Keys; 51             } 52         } 53  54         public object Model { 55             get { 56                 return _model; 57             } 58             set { 59                 SetModel(value); 60             } 61         } 62  63         public ModelStateDictionary ModelState { 64             get { 65                 return _modelState; 66             } 67         } 68  69         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] 70         public object this[string key] { 71             get { 72                 object value; 73                 _innerDictionary.TryGetValue(key, out value); 74                 return value; 75             } 76             set { 77                 _innerDictionary[key] = value; 78             } 79         } 80  81         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] 82         public ICollection<object> Values { 83             get { 84                 return _innerDictionary.Values; 85             } 86         } 87  88         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] 89         public void Add(KeyValuePair<string, object> item) { 90             ((IDictionary<string, object>)_innerDictionary).Add(item); 91         } 92  93         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] 94         public void Add(string key, object value) { 95             _innerDictionary.Add(key, value); 96         } 97  98         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] 99         public void Clear() {100             _innerDictionary.Clear();101         }102 103         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]104         public bool Contains(KeyValuePair<string, object> item) {105             return ((IDictionary<string, object>)_innerDictionary).Contains(item);106         }107 108         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]109         public bool ContainsKey(string key) {110             return _innerDictionary.ContainsKey(key);111         }112 113         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]114         public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex) {115             ((IDictionary<string, object>)_innerDictionary).CopyTo(array, arrayIndex);116         }117 118         [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Eval",119             Justification = "Commonly used shorthand for Evaluate.")]120         public object Eval(string expression) {121             if (String.IsNullOrEmpty(expression)) {122                 throw new ArgumentException(MvcResources.Common_NullOrEmpty, "expression");123             }124 125             return ViewDataEvaluator.Eval(this, expression);126         }127 128         [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Eval",129             Justification = "Commonly used shorthand for Evaluate.")]130         public string Eval(string expression, string format) {131             object value = Eval(expression);132 133             if (value == null) {134                 return String.Empty;135             }136 137             if (String.IsNullOrEmpty(format)) {138                 return Convert.ToString(value, CultureInfo.CurrentCulture);139             }140             else {141                 return String.Format(CultureInfo.CurrentCulture, format, value);142             }143         }144 145         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]146         public IEnumerator<KeyValuePair<string, object>> GetEnumerator() {147             return _innerDictionary.GetEnumerator();148         }149 150         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]151         public bool Remove(KeyValuePair<string, object> item) {152             return ((IDictionary<string, object>)_innerDictionary).Remove(item);153         }154 155         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]156         public bool Remove(string key) {157             return _innerDictionary.Remove(key);158         }159 160         // This method will execute before the derived type's instance constructor executes. Derived types must161         // be aware of this and should plan accordingly. For example, the logic in SetModel() should be simple162         // enough so as not to depend on the "this" pointer referencing a fully constructed object.163         protected virtual void SetModel(object value) {164             _model = value;165         }166 167         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]168         public bool TryGetValue(string key, out object value) {169             return _innerDictionary.TryGetValue(key, out value);170         }171 172         internal static class ViewDataEvaluator {173             public static object Eval(ViewDataDictionary vdd, string expression) {174                 //Given an expression "foo.bar.baz" we look up the following (pseudocode):175                 //  this["foo.bar.baz.quux"]176                 //  this["foo.bar.baz"]["quux"]177                 //  this["foo.bar"]["baz.quux]178                 //  this["foo.bar"]["baz"]["quux"]179                 //  this["foo"]["bar.baz.quux"]180                 //  this["foo"]["bar.baz"]["quux"]181                 //  this["foo"]["bar"]["baz.quux"]182                 //  this["foo"]["bar"]["baz"]["quux"]183 184                 object evaluated = EvalComplexExpression(vdd, expression);185                 return evaluated;186             }187 188             private static object EvalComplexExpression(object indexableObject, string expression) {189                 foreach (ExpressionPair expressionPair in GetRightToLeftExpressions(expression)) {190                     string subExpression = expressionPair.Left;191                     string postExpression = expressionPair.Right;192 193                     object subtarget = GetPropertyValue(indexableObject, subExpression);194                     if (subtarget != null) {195                         if (String.IsNullOrEmpty(postExpression))196                             return subtarget;197 198                         object potential = EvalComplexExpression(subtarget, postExpression);199                         if (potential != null) {200                             return potential;201                         }202                     }203                 }204                 return null;205             }206 207             private static IEnumerable<ExpressionPair> GetRightToLeftExpressions(string expression) {208                 // Produces an enumeration of all the combinations of complex property names209                 // given a complex expression. See the list above for an example of the result210                 // of the enumeration.211 212                 yield return new ExpressionPair(expression, String.Empty);213 214                 int lastDot = expression.LastIndexOf('.');215 216                 string subExpression = expression;217                 string postExpression = string.Empty;218 219                 while (lastDot > -1) {220                     subExpression = expression.Substring(0, lastDot);221                     postExpression = expression.Substring(lastDot + 1);222                     yield return new ExpressionPair(subExpression, postExpression);223 224                     lastDot = subExpression.LastIndexOf('.');225                 }226             }227 228             private static object GetIndexedPropertyValue(object indexableObject, string key) {229                 Type indexableType = indexableObject.GetType();230 231                 ViewDataDictionary vdd = indexableObject as ViewDataDictionary;232                 if (vdd != null) {233                     return vdd[key];234                 }235 236                 MethodInfo containsKeyMethod = indexableType.GetMethod("ContainsKey", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(string) }, null);237                 if (containsKeyMethod != null) {238                     if (!(bool)containsKeyMethod.Invoke(indexableObject, new object[] { key })) {239                         return null;240                     }241                 }242 243                 PropertyInfo info = indexableType.GetProperty("Item", BindingFlags.Public | BindingFlags.Instance, null, null, new Type[] { typeof(string) }, null);244                 if (info != null) {245                     return info.GetValue(indexableObject, new object[] { key });246                 }247 248                 PropertyInfo objectInfo = indexableType.GetProperty("Item", BindingFlags.Public | BindingFlags.Instance, null, null, new Type[] { typeof(object) }, null);249                 if (objectInfo != null) {250                     return objectInfo.GetValue(indexableObject, new object[] { key });251                 }252                 return null;253             }254 255             private static object GetPropertyValue(object container, string propertyName) {256                 // This method handles one "segment" of a complex property expression257 258                 // First, we try to evaluate the property based on its indexer259                 object value = GetIndexedPropertyValue(container, propertyName);260                 if (value != null) {261                     return value;262                 }263 264                 // If the indexer didn't return anything useful, continue265 266                 // If the container is a ViewDataDictionary then treat its Model property267                 // as the container instead of the ViewDataDictionary itself.268                 ViewDataDictionary vdd = container as ViewDataDictionary;269                 if (vdd != null) {270                     container = vdd.Model;271                 }272 273                 // Second, we try to use PropertyDescriptors and treat the expression as a property name274                 PropertyDescriptor descriptor = TypeDescriptor.GetProperties(container).Find(propertyName, true);275                 if (descriptor == null) {276                     return null;277                 }278 279                 return descriptor.GetValue(container);280             }281 282             private struct ExpressionPair {283                 public readonly string Left;284                 public readonly string Right;285 286                 public ExpressionPair(string left, string right) {287                     Left = left;288                     Right = right;289                 }290             }291         }292 293         #region IEnumerable Members294         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]295         IEnumerator IEnumerable.GetEnumerator() {296             return ((IEnumerable)_innerDictionary).GetEnumerator();297         }298         #endregion299 300     }

  ViewData的用法如下:ViewData["user"] = LoginUser;  页面的代码<%=(ViewData["user"] as Users).UserName%>

  ViewData的作用域从控制器设置值到页面值显示。

2.使用TempData

  TempData同样属于ControllerBase 的属性 用法和ViewData 基本相同,但是他们的实质是不同的,ViewData 是数据字典类型而TempData是Session存储的值,TempData数据只能在控制器中传递一次,每个元素也只能被访问一次,然后Session中的值就会被自动删除,它的生命周期要比ViewData的要长.

 

3.使用Model

  使用Model 顾名思义就是将一个实体对象绑定在页面上,上面两种都是放在作用域中。这里只讲用法。

  public ActionResult Student()

  {

    DbContext context=new DbContext();

    Student stu=context.Single(s=>s.ID==1);

    return View(stu);

  }

  页面代码的使用:<%=(Model as MVCTest.Models.Student).Name %>  Model 是ViewPage d的一个属性值,用于         接收控制器中返回的值

  Model 传输数据还可以这样用:

  <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MVCTest.Models.Student>" %>

  <%=Model.Name %>

  使用泛型的ViewPage,将Model中的值指定特定类型不用强制性转换

4.传递多个对象类型

  其实传递多个对象类型,最简单的办法就是将这些对象封装成另外一个类的属性,然后将这个对象传递到页面。不在做介绍

   

MVC进阶学习--View和Controller之间的数据传递(一)的更多相关文章

  1. MVC进阶学习--View和Controller之间的数据传递(二)

    1. 使用Request.Form MVC 将页面简单化,与WebForm中的事件机制完全不同,就和普通的html标签表单提交没有任何区别(当然WebForm中的事件机制其实也是表单提交).在表单提交 ...

  2. 【MVC框架】——View和Controller之间的传值

    在MVC中,Controller运行一个能够说是路由功能.它通过View传过来的数据,来决定应该调用哪一个Model,相同会把Model处理完的数据传给View,所以就总是涉及到Controller和 ...

  3. 【MVC架构】——怎样利用Json在View和Controller之间传递数据

    在MVC架构中,尽管非常多东西和三层非常相似,可是也有非常大的差别.就比方传递数据.在三层架构中,传递数据就仅仅要一层返回,另外一层用同样类型的变量来接收即可了.在MVC中,事实上原理是一样的,Con ...

  4. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  5. View 与 Controller 之间的delegate(代理)传值

    这个代理传值是经常使用的一种传值方式,下面介绍一种View 和 Controller 之间的代理传值方法. 先建立一个View视图 如 LoginView 是继承于一个UIView 在LoginVie ...

  6. MVC(Model(模型) View(视图) Controller(控制器))

    复习 1.      商品表 增删改查 index.php  add.php   view.php   edit.php   action.php 2.      MVC(Model(模型)  Vie ...

  7. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  8. [转]ASP.NET MVC中的两个Action之间值的传递--TempData

    本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...

  9. Activity之间的数据传递-android学习之旅(四十七)

    activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...

随机推荐

  1. Unity3D AssetBundles 动态加载游戏资源

    AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...

  2. 八. 输入输出(IO)操作4.面向字节的输入输出流

    字节流以字节为传输单位,用来读写8位的数据,除了能够处理纯文本文件之外,还能用来处理二进制文件的数据.InputStream类和OutputStream类是所有字节流的父类. InputStream类 ...

  3. 【OpenJudge3531】【背包DP】【膜法交配律】判断整除

    判断整除 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和.比如序列:1.2.4共有8种可能的序列:(+1) + (+ ...

  4. JAVA常见算法题(十五)

    package com.xiaowu.demo; /** * * 输入三个整数x,y,z,请把这三个数由小到大输出. * * @author WQ * */ public class Demo15 { ...

  5. Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle

    ylbtech-DatabaseDesgin:Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle DatabaseName:PetShop(宠物商店) Model:宠物商店网 ...

  6. python pip安装lxml失败(转)

    今天想要试试beautifulsoup4,安装的时候很顺利,然后就准备安装lxml作为解析器,没想到安装时pip直接给我报了一整页的错误. 解决过程 查看了一下错误提示,其中有如下一段: ****** ...

  7. tar命令解压缩出错

    [root@zhoucentos share1]# tar zxvf otp_src_19..tar.gz gzip: stdin: not in gzip format tar: Child ret ...

  8. 20160208.CCPP体系具体解释(0018天)

    程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针具体解 ...

  9. Spring管理的bean初始化方法的三种方式,以及@PostConstruct不起作用的原因

    1:Spring 容器中的 Bean 是有生命周期的,spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作.下面是常用的三种指定特定操作的方法: 通过实现InitializingBea ...

  10. PS如何制作超酷3D字效果

    效果图.jpg (24.94 KB) 2008-4-4 21:46 1.打开PS 执行文件-新建-新建550X400像素空白文档 1.jpg (36.69 KB) 2008-4-4 21:46 2.输 ...