Asp.net Mvc Framework 五 (向View传值以及Redirect)

ViewData与TempData属性来向View页传递对象
上文中已经提到,使用ViewData可以将数据由Controller传递到View
在前文中我们建立了EiceController类
在本文的示例中我们将这个Controller改一下
namespace MvcApplication2.Controllers
{
    
using System;
    
using System.Collections.Generic;
    
using System.Linq;
    
using System.Web;
    
using System.Web.Mvc;
    
/// <summary>
    
/// 记不记得前面讲过的,所有Controller都要继承于
    
/// Controller类当然Controller有很多种,我们慢慢讲
    
/// </summary>

    public class EiceController : Controller
    
{
        
public void Index() {
            ViewData[
"ViewData"= "在这里显示ViewData";
            TempData[
"TempData"= "在这里显示TempData";
            RenderView(
"Index");
        }

        
public void Index2() {
            RenderView(
"Index");
        }

    }

}
我们将Index的参数移除,并提供了ViewData和TempData的赋值
在Views/Eice/Index.aspx这个View中我们写以下代码
1:<%=ViewData["ViewData"]%><br />
2:<%=TempData["TempData"]%>
注意上面的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一般用于临时的缓存内容或抛出错误页面时传递错误信息
Redirect方法跳转页面到其它的Controller/Action
RedirectToAction(Action名);
RedirectToAction(Action名, Controller名);
RedirectToAction(RouteValueDictionary);
在这里前两种都没有什么好说的RedirectToAction("About","Home");就是一种写法
主要是第三种重载
用户可以这样写
            System.Web.Routing.RouteData routeData = new System.Web.Routing.RouteData();
            routeData.Values.Add(
"Action""About");
            routeData.Values.Add(
"Controller""Home");
            RedirectToAction(routeData.Values);

这样就可以完成页面跳转
当然,也可以使用传统的Response.Redirect来完成页面的跳转

Asp.net Mvc Framework 系列
posted @ 2008-03-11 17:18 重典 阅读(1544) 评论(22)  编辑 收藏 所属分类: Microsoft MVC

  回复  引用    
#1楼 2008-03-11 22:32 | appl [未注册用户]
顶! mvc中如何使用服务器控件?
  回复  引用  查看    
#2楼 [楼主]2008-03-12 08:52 | 重典      
@appl
简单的服务器端控件在Asp.netMvc上使用不会出错,但是无法像在WebForm中一样方便使用

控件的初始化这以这样进行
可以在View的cs文件中重写OnPreInit(EventArgs);
Render(HtmlTextWriter);
RenderView(ViewContext;

SetViewData(object);
在这里为服务器端控件赋值
复杂的服务器端控件还没有办法使用
  回复  引用  查看    
#3楼 2008-03-12 11:22 | 第一控制.NET      
只有少量控件值得用,其他的会破坏来之不易的对html的控制权,还是放弃为好啊。
  回复  引用  查看    
#4楼 [楼主]2008-03-12 11:28 | 重典      
@第一控制.NET
同意,只是许多的Asp.net的程序员,特别是没有接触过Asp传统编程以及没有Web标准概念的朋友,对控件有着一定的依赖
还要很长时间来过渡啊

  回复  引用  查看    
#5楼 2008-03-12 18:04 | 隨風.NET      
恩 看来终于到了抛弃服务器空间的时候了
重典有时间还是做个sample吧 比如做个留言板?
ps:现在项目中能使用这个了吗 可惜还是p2 正式版的时候会不会改动很多
  回复  引用  查看    
#6楼 [楼主]2008-03-12 18:18 | 重典      
@隨風.NET
虚拟主机 服务器也可以支持它这个没关系,我有一篇写在.net2.0下运行的,您可看一下
Sample等我写完那几个Helper的吧,要不初学者也会一头雾水的
现在项目中还在用Monorial,毕竟这个还不太成熟,等正式发布了再用在程序里吧
至于正式版会不会改动很多....我想应该会因为Preview看去的确有很多不成熟的地方,应该可以改进
  回复  引用  查看    
#7楼 2008-03-12 20:00 | 隨風.NET      
@重典
是否要必须iis7 iis6的话要设置的吧 这样虚拟主机不就不行了?
既然正式版会改进不少的话 那你的help怎么不到发了正式版再写呢?
  回复  引用  查看    
#8楼 [楼主]2008-03-12 20:16 | 重典      
@隨風.NET
http://www.cnblogs.com/chsword/archive/2008/03/11/1099699.html

IIS6可设置也可以不设,看你对扩展名的需要了

正式版会改进不少,但基本的东西应该不会改动很大,所以先写了让大家了解一下,之后的改动再做补充
  回复  引用  查看    
#9楼 2008-03-12 21:10 | 隨風.NET      
当然希望不要扩展名 呵呵
  回复  引用  查看    
#10楼 [楼主]2008-03-13 11:15 | 重典      
@隨風.NET
IIS6还是不够强大,只能将就了
  回复  引用  查看    
#11楼 2008-03-13 14:19 | miao~      
我想问下...用了这个东西以后是不是代码都写在Controller里
而 Views 里是HTML ??
  回复  引用  查看    
#12楼 [楼主]2008-03-13 16:40 | 重典      
@miao~
基本如此
但也有变通,一切都是为了实现而服务,所以不要因为某种约定而固步自封
  回复  引用    
#13楼 2008-07-01 09:40 | 小罗头 [未注册用户]
我非常期待正式版的MVC Framework,


放弃服务器控件挺好的,服务器控件的运行效率真的不敢恭维!
  回复  引用  查看    
#14楼 2008-07-30 16:09 | 孤独客      
重典兄
这里说的TempData只能在一个页面的访问是什么意思呢?它和Session有什么区别?
  回复  引用  查看    
#15楼 [楼主]2008-07-30 17:34 | 重典      
@孤独客
它是按访问过期的,

就是虽然是 存在于SESSION的,但是还是要计算访问的页面

Monorail的Flash是和tempdata一样效果的,它可以存储三次页面跳转
  回复  引用  查看    
#16楼 2008-08-30 16:58 | 勇敢的兽      
重典兄

TempData 可否设置页面跳转的存储次数呢??
  回复  引用  查看    
#17楼 2008-08-30 16:59 | 勇敢的兽      
另外
我要判断表单输入的准确性,用以下方法
=================================

TempData["ErrorMessage"] = "请填写标题";
return RedirectToAction("New");

=================================

这样做,我只是没有写标题,然后我写好的内容等其他TextBox里面的内容也会因为重新RedirectToAction而清空,有没有什么好的解决方法呢??
  回复  引用  查看    
#18楼 [楼主]2008-08-30 17:08 | 重典      
@勇敢的兽
在绑定时不使用ViewData["xxx"]=obj
而使用ViewData.Model绑定,即View(obj);

错误页不RedirectToAction而直接view并将相应的数据传入
  回复  引用  查看    
#19楼 [楼主]2008-08-30 17:09 | 重典      
@勇敢的兽
可以自定义tempdata
  回复  引用  查看    
#20楼 [楼主]2008-08-30 17:55 | 重典      
@重典
只要实现ITempDataProvider接口就行

pv5里自定义了一个 CookieTempDataProvider是存在Cookie里的

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-08-31 10:52 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: