刚从webform开发转到mvc,如果说像路由这样稍微复杂一点的知识点还可以暂时先放一放(前提是默认的路由规则基本满足大部分需求),那有个问题在快速开发中,我想是必须要当即解决的,那就是webform中的传值方式是否同样适用于mvc中。那么本文照旧分两部分来阐述。接下来先简单快速地回顾webform中的传值方式。

Part 1  WebForm中的传值方式

 Form表单传递(get/post)  

  1. //aspx
    <input type="text" id="txtName" name="txtName" runat="server"/>
    //aspx.cs
    string txtName = Request.Form["txtName"].ToString();
  2.  
  3. //隐藏域(以html服务器控件为例)
    <input type="hidden" id="hdUserId" runat="server" />
    hdUserId.Value = "1";

以上仅仅使用文本标签和隐藏域为例。只要通过Form表单提交的的数据(包含隐藏域),不论是什么标签。都属于这种传值方式。

 URL传递

1.超链接(以html标签为例):

  1. <a href="Default.aspx?param1=1111&param2=2222">Go</a>

2.PostBackUrl

  1. <asp:Button ID="btnCheckOut" Text="CheckOut" PostBackUrl="~/Default.aspx?UserId=1" runat="Server" />
  2. //get
  3. var userId=Request.QueryString["UserId"]

以上仅以<a>标签和PostBckUrl带参数传递为例。所有的这些通过url地址栏传递参数的都是URL传值。

 内置对象传递

1.Response.Redirect

  1. //page1
  2. string url = "Default.aspx?p1=" + p1 + "&p2=" + p1;
  3. Response.Redirect(url, false);
  4. //page2
  5. var p1 = Request.QueryString["p1"].ToString();
  6. var p2 = Request.QueryString["p2"].ToString();

采取这种方式实际上还是地址栏URL传值得方式。

2.Server.Transfer\Server.Execute

  1. //Default.aspx
  2. <input type="text" id="txtName" runat="server" />
  3. //Default.aspx.cs
  4. Server.Transfer("~/Default2.aspx", true);
  5. Server.Execute("~/Default2.aspx", true);
  6.  
  7. //Default.aspx.cs Page_Load
  8. Response.Write(Request.Form["txtName"])

这两种方式,地址栏并未发生重定向,因此这实际上还是利用了Form表单来实现值传递的。

3.Session:

  1. //set
  2. Session["name"] = txtName.Value;
  3. //get
  4. string name = Session["name"].ToString();

4.Cookie:

  1. //set
  2. HttpCookie cookie = new HttpCookie("MyCookie", aa);
  3. Response.Cookies.Add(cookie);
  4.  
  5. //get
  6. HttpCookie myCookie = Request.Cookies["MyCookie"];
  7. txt1.Value = myCookie.Value;

5.Cache

关于这个我不做叙述,详细的用法可以看细说 ASP.NET Cache 及其高级用法

6.Application

  1. //set
  2. Application["count"] = ;
  3. //get
  4. int count= (int)Application["count"].;

7.ViewState

关于这个话题,我不做过多叙述,可以看下这篇文章Beginner's Guide To View State

 Cross Page Posting (ASP.NET 2.0)

两个概念CrossPageSource.aspx(来源网页)  CrossPageTarget.aspx(目标网页)

1.获取来源网页的控件的值

  1. //Default.aspx(来源网页)
  2. <input type="text" id="txtName" runat="server" />
  3. <asp:Button Text="test" runat="server" PostBackUrl="~/Default2.aspx" />
  4.  
  5. //Default2.aspx.cs(目标网页)
  6. if (PreviousPage.IsCrossPagePostBack) {
  7. //获取来源页的控件的值
  8. Response.Write(Request.Form["txtName"]);
    //or
  9. Response.Write((PreviousPage.FindControl("txtName") as System.Web.UI.HtmlControls.HtmlInputText).Value);
  10. }

2.获取源网页属性值

  1. //Default.aspx(来源网页)
  2. <input type="text" id="txtName" runat="server" />
  3. <asp:Button Text="test" runat="server" PostBackUrl="~/Default2.aspx" />
  4. //Default.aspx.cs 公共属性
    public string Name {
        get {
            return txtName.Value;
        }
    }
    //Default2.aspx(目标网页)
    <%@ PreviousPageType VirtualPath="~/Default.aspx" %>
  5. //Default2.aspx.cs
  6. if (PreviousPage.IsCrossPagePostBack) {
  7. //获取属性的值  
    Response.Write(PreviousPage.Name);
  8. }

注:PreviousPage需要做非空判断

Part 2 MVC传值方式

在开始了解asp.net mvc各种传值方式之前,我们先来看下面这张图。它很形象的阐明了各个级别之间传递值的方式。

(来自互联网)

从图上不难看出asp.net mvc中独有的传值方式有ViewData、ViewBag、TempData。当然还有ViewModel和Model。当然细心的你可能发现这个图并不完美。稍作改动如下:

 ViewData\ViewBag

关于它们两个我们先来看一组对照:

(图片来自互联网)

虽然ViewBag在asp.net mvc 3才出现,但它实质上它其实是一个包了一层Dynamic的ViewData(关于这个,可以看看ViewData和ViewBag的那些事,这里就不再细述),也就是对ViewData的封装,这样再看它们之间的差异时,我们就不难理解了。接下来看示例:

Action:

  1. public ActionResult Index() {
  2. ViewData["Message1"] = "This Message is coming from ViewData";
  3. ViewBag.Message = "This Message is coming from ViewBag";
  4. return View();
  5. }

View:

  1. <div>
  2. @ViewData["Message1"]
  3. </div>
  4. <div>
  5. @ViewBag.Message
  6. </div>

结果:

上面讲到VieBag实质上其实是一个包了一层Dynamic的ViewData,而我们对ViewBag的动态属性进行赋值,值实际上是存到了ViewData中,动态属性的名存成了ViewDataDictionary的键,动态属性的值存成了ViewDataDictionary的值。为了论证这一点,我们将上面的代码做下的改动,再看运行结果:
(控制器)

-------------------------------------------------------------------------------------------------------------------------------

(运行结果)

果不其然,如同变量被重新赋值。由于实际上它们key同名了,而最终又是都是ViewDataDictionary的方式来存储的,所以后来的值将原先的给覆盖掉了。同样的道理,即使后台不做改动,我们在前台通过@ViewData["Message"]取到的是ViewBag.Message的值:

(调试进程)

小结:ViewData、ViewBag主要是将数据从控制器级别传递到视图级别

 TempData

TempData是TempDataDictionary的字典类型。它不仅可以将数据从action传递到视图,还可以传递到后续请求的action操作。在执行控制器的Execute()方法首先创建TempData对象(在Ruby On Rails中叫做Flash对象)。TempData可以用于保存下次请求必须的临时数据(TempData和会话状态差不多,不长期占用内存)。。接下来看示例:

(控制器)

-------------------------------------------------------------------------------------------------------------------------------

(视图)

为了直接说明TempData可以将数据从一次请求传递到后续请求以及从控制器传递到视图,我直接在TestTempData操作中创建TempData["BookData"],然后传递到Index操作中,然后在Index的视图中展现数据。运行结果如下:

(运行结果)

-------------------------------------------------------------------------------------------------------------------------------

接下来,我们尝试刷新页面,很不幸的事情发生了:未将对象引用到对象的实例。调试发现TempData的值已经变为null:

(调试进程)

之所以会这样这是由TempData的生命周期决定的:TempData只能保存数据到它的下一次请求。这其实是和TempData的存储机制有关。关于TempData的实现机制可以看下下面这篇文章:浅谈ASP.NET MVC中TempData的实现机制。当然asp.net mvc同样为我们提供了TempDaa持续保存数据的实现方式:

  1. public ActionResult Index()
  2. {
  3. Book book = TempData["BookData"] as Book;
  4. TempData.Keep("BookData");
  5. //保存tempdate的值
  6. return View(book);
  7. }

这也是基于TemData的实现机制,在下一次请求之前会移除TempData中任何没有被更新的键值对。于是我们通过keep对响应的key进行更新。

 ViewModel

  1. public ActionResult Index()
  2. {
  3. Book book = TempData["BookData"] as Book;
  4. TempData.Keep("BookData");
  5. //保存tempdate的值
  6. return View(book);
  7. }

视图:

  1. <div>
  2. ID: @Model.ID<br />
  3. BookName:@Model.BookName<br />
  4. Author: @Model.Author<br />
  5. ISBN: @Model.ISBN
  6. </div>

运行结果:

关于它们使用选择的问题大家可以看下这篇文章:

When to use ViewBag, ViewData, or TempData in ASP.NET MVC 3 applications - See more at: http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications#sthash.xQL1qFqG.dpuf

Part 3  The end

其它的像Session、Application、Cookie、Cache因为是基于asp.net框架的,和webform中使用的方式是一样的,这里就不做赘述。

注:由于个人技术有限,对某些概念的理解可能会存在偏差,如果你发现本文存在什么bug,请指正。谢谢!

完。

MVC&WebForm对照学习:传值方式的更多相关文章

  1. MVC&WebForm对照学习:文件上传(以图片为例)

    原文  http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页::  ::  ::  ::管理 5 Posts :: 0 ...

  2. MVC&WebForm对照学习:文件下载

    说完了WebForm和MVC中的文件上传,就不得不说用户从服务器端下载资源了.那么今天就扯扯在WebForm和MVC中是如何实现文件下载的.说起WebForm中的文件上传,codeshark在他的博文 ...

  3. MVC&WebForm对照学习:ajax异步请求

    写在前面:由于工作需要,本人刚接触asp.net mvc,虽然webform的项目干过几个.但是也不是很精通.抛开asp.net webform和asp.net mvc的各自优劣和诸多差异先不说.我认 ...

  4. ASP.NET MVC Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

  5. MVC中页面的传值方式总结

    MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一:ViewData 获取或设置一个字典,其中包含在控制器和视图之间传递的数据.使用ViewD ...

  6. ASP.NET MVC View向Controller传值方式总结

    1:QueryString传值1)也可以使用new{}来为form的action增加querystring2)在controler里使用Request.QueryString["word&q ...

  7. dotNET5的MVC页面传值方式总结

    本文大致讲解mvc前后端的传值方式,包括control向view.view向control.以及action向action. 一.经典回顾 二.Controller向View传值 1. ViewBag ...

  8. mvc页面间的传值

    本文大致讲解mvc前后端的传值方式,包括control向view.view向control.以及action向action. 回顾 我们回顾下在ASP.NET WebForms中,页面之间最常用的传值 ...

  9. MVC:Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

随机推荐

  1. linux “命令行自动补全”功能用命令

    是按Tab键,左上角ESC的下面两个,如果你当前目录只有一项,只需要直接Tab,如果有多项,输入前面不同的部分再Tab,一般输入3个字母就可以,如果按一下没效果,按两下会列出所有项,然后再输入一点自己 ...

  2. FreePlan Windows下默认乱码解决方案

    FreePlan 做为一个开源的跨平台的思维导图软件非常好用. 笔者最近在Windows下使用时发现,新建导图文件时默认总是乱码,每次新建元素都需要手动设置一下字体才行. 研究一下,估计是默认模板问题 ...

  3. REST和SOAP Web Service的区别比较

    本文转载自他人的博客,ArcGIS Server 推出了 对 SOAP 和 REST两种接口(用接口类型也许并不准确)类型的支持,本文非常清晰的比较了SOAP和Rest的区别联系! ///////// ...

  4. VS2010 MFC DataGrid绑定实例

    VS2010环境下MFC使用DataGrid绑定数据源 参考:http://blog.csdn.net/fddqfddq/article/details/7874706 详细介绍如何在MFC中使用Da ...

  5. URAL 1297 Palindrome 最长回文子串

    POJ上的,ZOJ上的OJ的最长回文子串数据量太大,用后缀数组的方法非常吃力,所以只能挑个数据量小点的试下,真要做可能还是得用manacher.贴一下代码 两个小错,一个是没弄懂string类的sub ...

  6. Codeforces 337D Book of evil

    一道树形dp,写出来是因为最近也做了道类似的.这题是看了分析的思路才做出来的,但感觉很多这样的dp都是利用类似的性质.像这题的话distDown很好想,但distUp的时候就很难想了,其实只要抓住di ...

  7. VisualSVN Server的windows 2003配置和使用方法(图文并茂)

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...

  8. [hackerrank]Closest Number

    https://www.hackerrank.com/contests/w5/challenges/closest-number 简单题. #include <iostream> #inc ...

  9. C语言的字符测试函数

    C语言的字符测试函数 isalnum, isalpha, isdigit, isxdigit, isblank, isspace, isascii, iscntrl, ispunct, isgraph ...

  10. HTML5 编辑 API 之 Range 对象(二)

    1.Range.cloneContents()The Range.cloneContents() returns a DocumentFragment copying the objects of t ...