@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta content="width=device-width" /> <title>Index2</title> </head> <body> <div> the message is:@ViewBag.message<br/> the day is:@ViewBag.Date.DayOfWeek </div> </body> </html>
运行效果如下:
相对于视图模型对象方面,ViewBag有一个优点,即它能够很容易地发送多个对象到视图。假如我们被限制只能使用视图模型,那么为了实现相同的效果需要创建一个新的类型具有string和DateTime两个类型的的成员。使用动态对象可以在视图中输入属性和方法调用的任意序列。
3.3.3、使用ViewData传递数据
ViewData是在MVC3之前的版本中出现的,主要的功能类似于ViewBag,但ViewData是使用ViewDataDictionary类实现的而不是一个动态的类型,ViewDataDictionary类是一个常规的键/值对的集合,并通过Controller类的ViewData属性访问。如下示例:
Controller部分
public ViewResult Index2() { ViewData["message"] = "Hello ViewBag!"; ViewData["Date"]=DateTime.Now; return View(); }
View部分
public class MySecondController : Controller { public ActionResult Index() { TempData["Message"] = "Hello TempData"; TempData["Data"] = "TempData的值只能读取一次"; return View(); } public ActionResult TempDataTest() { return View(); } }
运行结果与VIewBag运行结果一致。
上面的代码中,我们看到ViewData需要对object对象进行类型转换,现在有了ViewBag以后,推荐使用ViewBag,并且尽量使用强类型视图和视图模型。
3.3.4、使用TempData传递数据
在【3.4.4、使用TempData保留重定向数据】节中会介绍使用TempData传递数据,这里不作介绍。
3.4、执行重定向
有一种动作(Action)方法的通常结果并不是直接产生输出,而是把用户的浏览器重定向导另一个URL。大多数情况下,这个URL是应用程序的另一个动作(Action)方法,用来生成你希望用户看到的输出。
重定向的Action方法不产生任何的输出,只是让浏览器重新请求一个其它的URL。在MVC程序中,一般会定向到其它的Action方法来产生输出。
在执行重定向时,发送了两个HTTP代码中的一个到浏览器。
(1)、发送HTTP 302状态编码,代表暂时重定向。(常用类型)
(2)、发送HTTP 301状态编码,表示永久重定向。(使用需谨慎)
重定向的类型有:1.重定向到文本URL 2.重定向到路由系统的URL 3.重定向到动作(Action)方法
3.4.1、重定向到文本URL
对浏览器重定向最基本的方式是调用Redirect方法,它返回RedirectResult类的一个实例。如下示例:
如果希望重定的URL被表示成一个字符串,并作为参数传递给Redirect方法。Redirect方法发送的是一个临时重定向。可以用RedirectPermanent方法发送一个永久重定向。例如:
3.4.2、重定向到路由系统的URL
使用重定向到文本URL的缺点是:限定了URL,当路由发生改变后,必须更新URL。幸好我们可以使用路由系统,用RedirectToRoute方法来生成有效的URL该方法会创建 RedirectToRouteResult的一个实例。如下所示:
3.4.3、重定向到动作(Action)方法
使用RedirectToAction方法能够很优雅的重定向到一个Action方法,这个方法仅仅是对RedirectToRoute方法的封装,让你指定Action方法和控制器的值,而不需要创建一个匿名类型。如下所示:
如果想重定向到其他的控制器,需要提供一个控制器的名称如:
注意:传入的Action参数或控制器参数在它们被传递给路由系统之前是不会被验证的,所以要确保目标控制器和Action方法是存在的。
3.4.4、使用TempData保留重定向数据