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

最常见的来自Action方法的响应就是生成HTML并发送给浏览器,为了使用动作结果(ActionResult)生成HTML,需要创建一个指定了要呈现的视图ViewResult类的实例。我们在Home控制器中编写如下代码.代码中指定了HomePage的视图。

控制器与动作(Controller And Action)

当MVC框架调用ViewResult对象的ExecuteResult时,就会开始对指定的View进行搜素。

使用了区域(Area),则搜索顺序如下:

1、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.aspx

2、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.ascx

3、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.aspx

4、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.ascx

5、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.cshtml

6、/Area/<AreaName>/Views/<ControllerName>/<ViewName>.vbhtml

7、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.chtml

8、/Area/<AreaName>/Views/Shared/<ControllerName>/<ViewName>.vbhtml

如果没有使用区域(Area)或者在前面找不到则会在下面搜索,搜索顺序如下:

1、/Views/<ControllerName>/<ViewName>.aspx

2、/Views/<ControllerName>/<ViewName>.ascx

3、/Views/Shared/<ControllerName>/<ViewName>.aspx

4、/Views/Shared/<ControllerName>/<ViewName>.ascx

5、/Views/<ControllerName>/<ViewName>.cshtml

6、/Views/<ControllerName>/<ViewName>.vbhtml

7、/Views/Shared/<ControllerName>/<ViewName>.chtml

8、/Views/Shared/<ControllerName>/<ViewName>.vbhtml

只要有一个视图找到,就停止搜索,并开始将找到的视图(View)呈现给客户端。

通过路径来指定呈现的视图(View)

这种命名约定的方法非常方便和简捷,但是它限制了我们所能呈现的一些视图。如果要呈现一个具体的视图,可以提供一个明确的路径,下面是一个例子。

控制器与动作(Controller And Action)

当我们这样指定一个视图时,指定的路径必须以“/”或者“~/”并且包含扩展名(如:.aspx)。当然不推荐这样来使用,因为这不利于程序的扩展和维护,这是一种绑定或耦合,有违MVC设计思想,可以有其他的方法来达到同样的效果例如:使用RedirectToAction()方法。

View辅助方法

View():返回到Action同名的视图。

View(“viewName”):返回到此控制器的ViewName视图。

View(“~/views/othercontroller/viewname.cshtml”):这种方式必须以~/或者/开头,但并不建议这么做,因为可以调用RedirectToAction这样的方法。

View(“viewname”,”layout”):呈现这个视图的时候,换一个母版页。

3.3、将数据从动作(Action)方法传递给视图(View)

传输数据的几种方式:1.视图模型  2.ViewData  3.ViewBag  4.TempData

3.3.1、提供视图模型对象

将一个对象作为View方法的参数传递给视图。例如:

Controller部分

public ViewResult Index2() { DateTime date = DateTime.Now; return View(date); }

View部分,添加视图时,选择Razor视图引擎。

@{ ViewBag.Title = "Index2"; } <h2>Index</h2> The day is: @(((DateTime)Model).DayOfWeek)

上面的视图是一个没有类型或者说是弱类型的视图,它不知道关于视图模型对象的任何信息,并且将它作为object对象的实例进行处理。为了得到DayOfWeek属性的值,需要将object对象的实例强转为DateTime,这样做能够实现效果,但却让视图变得杂乱。

我们可以通过创建强类型的View来改进,即在View里指定视图模型对象的类型,只需要添加代码:@model DateTime,如下所示:

@model DateTime @{ ViewBag.Title = "Index2"; } <h2>Index</h2> The day is: @Model.DayOfWeek

运行结果如下:

控制器与动作(Controller And Action)

可以发现,使用强类型的视图不仅让视图变得整洁,而且方便我们编码,因为对属性有智能感知。如下图所示:

控制器与动作(Controller And Action)

3.3.2、使用ViewBag传递数据

在前面我们已经使用过了ViewBag视图包这个特性,该特性允许你在一个动态对象上定义任意属性,并能够在视图里面访问。如下所示:

Controller部分

public ViewResult Index2() { ViewBag.Message = "Hello ViewBag!"; ViewBag.Date=DateTime.Now; return View(); }

View 部分

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

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