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 重典 阅读(2499) 评论(25)  编辑 收藏 网摘 所属分类: ASP.NET 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里的

  回复  引用  查看    
#21楼2009-06-13 09:54 | 天堂口      
能否在一个页面里面实现多个controller里面的多个action呢?
  回复  引用    
#22楼2009-06-13 14:29 | cokkiy[未注册用户]
@天堂口
可以

  回复  引用  查看    
#23楼[楼主]2009-06-13 15:08 | 重典      
@天堂口
RenderAction就好了,后面有讲到




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1100856




相关文章:

相关链接: