ASP.NET MVC2中Controller向View传递数据的三种方式

简介:

在Asp.net mvc开发中,Controller需要向View提供Model,然后View将此Model渲染成HTML。这篇文章介绍三种由Controller向View传递数据的方式,实现一个DropDownList的显示。

第一种:ViewData

ViewData是一个Dictionary。使用非常简单,看下面代码:

1  public  ActionResult ViewDataWay( int  id)
2  {
3  Book book  = bookRepository.GetBook(id);
4  ViewData[ " Countries " = new  SelectList(PhoneValidator.Countries, book.Country);
5  return  View(book);
6  }

在View中使用下面代码取值:

1  < div  class ="editor-field" >
2  <% =  Html.DropDownList( " Country " , ViewData[ " Countries " as  SelectList)  %>
3  <% : Html.ValidationMessageFor(model  =>  model.Country)  %>
4  </ div >

上面代码使用as将它转换成SelectList。

处理POST代码如下:

复制代码
1  [HttpPost]
2  public  ActionResult ViewDataWay( int  id, FormCollection collection)
3  {
4  Book book  =  bookRepository.GetBook(id);
5  UpdateModel < Book > (book);
6  bookRepository.Save(book);
7  return  RedirectToAction( " Details " new  { id = id});
8  }
复制代码

效果:

第二种:ViewModel

使用ViewModel的方式,我们先创建一个BookViewModel,代码如下:

复制代码
1  public class  BookViewModel
2  {
3  public  Book Book
4  {
5  get ;
6  set ;
7  }
8 
9  public  SelectList Countries
10  {
11  get ;
12  set ;
13  }
14  public  BookViewModel(Book book)
15  {
16  Book  =  book;
17  Countries  = new  SelectList(PhoneValidator.Countries,book.Country);
18  }
19  }
复制代码

在控制器的Aciton使用ViewModel存放数据的代码如下:

1  public  ActionResult ViewModelWay( int  id)
2  {
3  Book book  =  bookRepository.GetBook(id);
4  return  View( new  BookViewModel(book));
5  }

在View中,这种方式比第一种方式好在:它支持智能感应。

效果和第一种方式一样。

第三种:TempData

使用TempData和使用ViewData方法是一样的。

Action代码如下:

1  public  ActionResult TempDataWay( int  id)
2  {
3  Book book  =  bookRepository.GetBook(id);
4  TempData[ " Countries " = new  SelectList(PhoneValidator.Countries, book.Country);
5  return  View(book);
6  }

View取值的代码如下:

1  < div  class ="editor-field" >
2  <% =  Html.DropDownList( " Country " , TempData[ " Countries " as  SelectList)  %>
3  <% : Html.ValidationMessageFor(model  =>  model.Country)  %>
4  </ div >

效果:第一种方式一样。

TempData和ViewData的区别

做个简单的测试看下看下TempData和ViewData的区别

复制代码
1 
2  public  ActionResult Test1()
3  {
4 
5  TempData[ " text " = " 1-2-3 " ;
6  ViewData[ " text " = " 1-2-3 " ;
7  return  RedirectToAction( " Test2 " );
8 
9 
10  }
11 
12 
13  public  ActionResult Test2()
14  {
15 
16  string  text1  =  TempData[ " text " as string ;
17  string  text2  =  ViewData[ " text " as string ;
18  return  View();
19 
20  }
复制代码

看下面截图,发现经过Test1经过RedirectToAction跳转Test2后,ViewData的值已经被清空,而TempData没有被清空,这是它们的区别之一,我们可以用TempData在Controller之间传递数据。

关于TempData和ViewData的区别,发现网上大部分说法感觉都不对,网上有种说法:

1、TempData的数据至多只能经过一次Controller传递, 并且每个元素至多只能被访问一次

2、TempData中的元素被访问一次以后就会被删除

   我试一下,发现TempData和ViewData都只会在一次请求中有效,在第二次请求的时候都失效。而TempData可以在在一次请求中的多个Controller之间传递数据,而ViewData却不行,上图能证明。TempData也可多次访问。应该是说MVC在请求周期结束的时候有动作去删除此类的Session,而不是访问一次就被删除。MS命名为TempData,意思应该是说TempData是个Session,但是它又和普通的Session不同。它会在请求之后被删除,所以是临时的Data。

总结:本文简单介绍了一下在Asp.net MVC中控制器向View传值的三种方式,还有介绍了一下TempData和ViewData的不同。如果还有其他方法,请给我留言。谢谢。




本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html,如需转载请自行联系原作者

相关文章
|
16天前
|
开发框架 .NET 数据库连接
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
|
2月前
|
开发框架 JSON 前端开发
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
|
15天前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
26 0
|
16天前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
20天前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
72 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
137 0
|
4月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
62 0
|
4月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
234 5
|
4月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
|
4月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css