控制器与动作(Controller And Action)(4)

@{ 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>

运行效果如下:

控制器与动作(Controller And Action)

相对于视图模型对象方面,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类的一个实例。如下示例:

控制器与动作(Controller And Action)

如果希望重定的URL被表示成一个字符串,并作为参数传递给Redirect方法。Redirect方法发送的是一个临时重定向。可以用RedirectPermanent方法发送一个永久重定向。例如:

控制器与动作(Controller And Action)

3.4.2、重定向到路由系统的URL

使用重定向到文本URL的缺点是:限定了URL,当路由发生改变后,必须更新URL。幸好我们可以使用路由系统,用RedirectToRoute方法来生成有效的URL该方法会创建 RedirectToRouteResult的一个实例。如下所示:

3.4.3、重定向到动作(Action)方法

使用RedirectToAction方法能够很优雅的重定向到一个Action方法,这个方法仅仅是对RedirectToRoute方法的封装,让你指定Action方法和控制器的值,而不需要创建一个匿名类型。如下所示:

如果想重定向到其他的控制器,需要提供一个控制器的名称如:

控制器与动作(Controller And Action)

注意:传入的Action参数或控制器参数在它们被传递给路由系统之前是不会被验证的,所以要确保目标控制器和Action方法是存在的。

3.4.4、使用TempData保留重定向数据

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdpszd.html