ASP.NET MVC 重点教程一周年版 第四回 向View传值

一、ViewData与TempData属性来向View页传递对象


上文中已经提到,使用ViewData可以将数据由Controller传递到View
在前文中我们建立了EiceController类
在本文的示例中我们将这个Controller改一下

   public class EiceController : Controller
    {
        public ActionResult Index()
        {
            ViewData["ViewData"] = "在这里显示ViewData";
            TempData["TempData"] = "在这里显示TempData";
            return View();
        }
        public ActionResult Index2()
        {
            return View("Index");
            //这里指定了规定显示的View文件即Eice目录下的Index.aspx
        }
    }

我们将Index的参数移除,并提供了ViewDataTempData的赋值
在Views/Eice/Index.aspx这个View中我们写以下代码

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
	Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
1:<%=ViewData["ViewData"]%><br />
2:<%=TempData["TempData"]%>
</asp:Content>

 

注意上面的1.2不是行号,是我写的。

接下来我们运行工程
访问http://localhost/Eice/Index
可以看到运行得到以下

1.在这里显示ViewData
2.在这里显示TempData

再访问http://localhost/Eice/Index2
显示结果为

1.
2.在这里显示TempData

这里1显示是的ViewData中的内容,2为TempData传递的内容

我们可以看到ViewData只能在当前Action中有效
但是TempData可以类似于Session一样到其它页面仍然存在,但只限一页的访问(类似于Monorail中的Flash)
TempData一般用于临时的缓存内容或抛出错误页面时传递错误信息。

二、通过ViewData.Model来传递对象

我们先建立一个Model:EiceIndexModel.cs。

    public class EiceIndexModel
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        public bool  Sex { get; set; }
    }

 

之后我们建立一个新的Action:Index3

        public ActionResult Index3(){
            var m = new EiceIndexModel
            {
                Name = "邹健",
                Sex = true
            };
            return View(m);
        }

 

我们下面为Index3建立View文件,仍然是在Index3上点击右键AddView

image

于是自动生成了一个View文件,我们运行看结果:

image

 

 

如果我们想要显示其它的文件我们应该怎么办呢?

posted @ 2009-03-12 00:17 重典 阅读(11291) 评论(32) 编辑 收藏

 回复 引用 查看   
#1楼2009-03-13 09:12 | 逸之羊      
你图片不是没了么?
 回复 引用 查看   
#2楼[楼主]2009-03-13 10:28 | 重典      
@逸之羊
所有的图都是新截的

 回复 引用 查看   
#3楼2009-04-02 17:56 | 鱼蛋      
您就是邹建?? sql很牛X的那位?
 回复 引用 查看   
#4楼[楼主]2009-04-02 18:29 | 重典      
@鱼蛋
完全不是。。。。
那位是邹建,是老一辈的CSDN版主

我是邹健,是新一代的自由博客人

贫了点不要见怪

 回复 引用 查看   
#5楼2009-04-03 11:17 | 鱼蛋      
原来如此, 不过您也挺牛X的

怪了,我Add View时, 填入View data class后, view content怎么是灰的不能选呢

 回复 引用 查看   
#6楼[楼主]2009-04-03 11:55 | 重典      
@鱼蛋
重建个项目看看还好不好使,不果还不好使的话
\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC\CodeTemplates
看看这里面是不是文件有问题

 回复 引用 查看   
#7楼2009-04-16 09:48 | 风疑      
能不能麻烦重典大神帮忙解释解释 add view 的对话框中各个选项的意义呢?
 回复 引用 查看   
#8楼[楼主]2009-04-16 13:25 | 重典      
@风疑 Create a Partial View勾选以后建的是ascx而不是aspx Create a strong-typed view 创建强类型的View文件(就是ViewPage泛型) ViewDataCLass上述泛型的T View Content:使用哪个模板生成 其它的我在文章的图中注释了
 回复 引用 查看   
#9楼2009-05-08 23:38 | 温景良(Jason)      
学习
 回复 引用 查看   
#10楼2009-05-14 09:03 | 谊生      
向前辈们,学习.
 回复 引用 查看   
#11楼2009-05-20 12:39 | 嘻嘻哈哈      
"我们先建立一个Model:EiceIndexModel.cs。"
需要在EiceController.cs添加一行using MvcApplication1.Models;
这样才能跑起来

 回复 引用 查看   
#12楼2009-05-27 09:46 | 蓝色的风之精灵      
我们先建立一个Model:EiceIndexModel.cs。

这个怎么建立?在Models目录下添加一个EiceIndexModel类,但是在Add View对话框里没有EiceIndexModel可选

 回复 引用 查看   
#13楼2009-06-01 15:21 | -brian-      
@蓝色的风之精灵
重新生成一下项目

 回复 引用 查看   
#14楼2009-06-01 15:22 | -brian-      
lz写的不错,支持下
 回复 引用 查看   
#15楼2009-06-13 09:50 | 天堂口      
如果ViewData.Model是有图片路径的,怎么把图片显示出来呢?
 回复 引用 查看   
#16楼[楼主]2009-06-13 15:07 | 重典      
@天堂口
请具体说明一下问题

 回复 引用 查看   
#17楼2010-01-16 16:58 | kaixin001      
引用天堂口:如果ViewData.Model是有图片路径的,怎么把图片显示出来呢?


<img src="<%= Url.Content(Model.Url) %>" />

 回复 引用 查看   
#18楼2010-01-22 09:43 | 俊采星驰      
我按LZ的例子当我再访问http://localhost/Eice/Index2 结果是viedata和tempdata里的数据都没显示,请问这是怎么回事!!
 回复 引用 查看   
#19楼2010-01-24 22:55 | show_show      
例子没有问题


比其它的 MVC博客 更易学

 回复 引用 查看   
#20楼2010-02-08 16:54 | HOH      
@鱼蛋
是你虽然添加了Model类,但是没有把项目编译一边,你把项目编译了后,再添加View,就可以了,建议博主能加上说明

 回复 引用 查看   
#21楼2010-04-25 14:27 | 精彩      
我和18楼一样的,怎么回事呀..
 回复 引用 查看   
#22楼[楼主]2010-04-25 20:35 | 重典      
@精彩
@俊采星驰
如果ASP.NET MVC 是2.0版本,使用Response.Redirect的时候无法传递TempData,而要使用return Redirect(url);

 回复 引用 查看   
#23楼2010-04-25 20:46 | 精彩      
@重典
对不起哈,才学,没看出来哪里用了什么Response.Redirect..
就是访问index2的时候,你说会缓存的tempdata
在index2上依然没显示
    public ActionResult Index()
        {
            ViewData["ViewData"] = "在这里显示ViewData";
            TempData["TempData"] = "在这里显示TempData";
            return View();
        }


        public ActionResult Index2()
        {
            return View("Index");
        }

 回复 引用 查看   
#24楼2010-04-28 23:07 | 逸航      
我的和18楼,22楼的都一样,http://localhost/Eice/Index2 无法显示TempData的数据,你能解释清楚一下吗?

---ASP.NET MVC 是2.0版本,使用Response.Redirect的时候无法传递TempData,而要使用return Redirect(url);

不懂什么意思,要怎么改?我的是2.0版本


 回复 引用 查看   
#25楼[楼主]2010-04-29 09:04 | 重典      
@逸航
public class EiceController : Controller
{
public ActionResult Index()
{
ViewData["ViewData"] = "在这里显示ViewData";
TempData["TempData"] = "在这里显示TempData";
return RedirectToAction("Index2");
}
public ActionResult Index2()
{
return View("Index");
//这里指定了规定显示的View文件即Eice目录下的Index.aspx
}
}

 回复 引用 查看   
#26楼2010-05-01 21:25 | 逸航      
开始还好好的,突然报错,错误原因是:
"/"应用程序中的服务器错误
这个应该是路径错误,在网上找办法修改如下

routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
new string[]{控制器的命名空间}
);

还是没用,或者代码恢复到以前的状态,还是不行,只好重建工程,有什么好的解决方式么?

 回复 引用 查看   
#27楼2010-05-31 16:07 | vincentng      
引用逸航:
我的和18楼,22楼的都一样,http://localhost/Eice/Index2 无法显示TempData的数据,你能解释清楚一下吗?

---ASP.NET MVC 是2.0版本,使用Response.Redirect的时候无法传递TempData,而要使用return Redirect(url);

不懂什么意思,要怎么改?我的是2.0版本



是不是改为
public ActionResult Index2()
{
return Redirect("Index");
}

但改后依然得到
1.在这里显示ViewData
2.在这里显示TempData

这样就区分不了ViewData & TempData?

 回复 引用 查看   
#28楼[楼主]2010-06-01 12:55 | 重典      
@vincentng
是的,或者使用RedirectToAction也可以

 回复 引用 查看   
#29楼2010-07-21 15:56 | 周国选      
向前辈学习.
 回复 引用 查看   
#30楼2010-07-29 10:23 | 莫名vs奇妙      
Inherits="System.Web.Mvc.ViewPage<EiceIndexModel>" %>

aspx页面的最上面的继承选项需要继承model的类

然后下面使用model的信息的时候 直接 Model.sex 就行了

 回复 引用 查看   
#31楼2010-12-16 17:32 | cean      
我们下面为Index3建立View文件,仍然是在Index3上点击右键AddView
==================
出现以下错误,应该要怎么解决?谢谢

未能加载类型“System.Web.Mvc.ViewPage<MvcApplication1.Models.EiceIndexModel>”。


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.EiceIndexModel>" %>

 回复 引用 查看   
#32楼2012-01-15 15:51 | Fly the way      
public ActionResult Index2()
{
return View("Index");
//这里指定了规定显示的View文件即Eice目录下的Index.aspx
}
重典兄,这里就写了个Index参数,而Home里面也有个Index页面,它是怎么识别为ELice文件夹下的Index的,还有执行时有几个Controler,为什么就偏偏执行了ELiceControler。多谢了