最常见的来自Action方法的响应就是生成HTML并发送给浏览器,为了使用动作结果(ActionResult)生成HTML,需要创建一个指定了要呈现的视图ViewResult类的实例。我们在Home控制器中编写如下代码.代码中指定了HomePage的视图。
当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)
这种命名约定的方法非常方便和简捷,但是它限制了我们所能呈现的一些视图。如果要呈现一个具体的视图,可以提供一个明确的路径,下面是一个例子。
当我们这样指定一个视图时,指定的路径必须以“/”或者“~/”并且包含扩展名(如:.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
运行结果如下:
可以发现,使用强类型的视图不仅让视图变得整洁,而且方便我们编码,因为对属性有智能感知。如下图所示:
3.3.2、使用ViewBag传递数据
在前面我们已经使用过了ViewBag视图包这个特性,该特性允许你在一个动态对象上定义任意属性,并能够在视图里面访问。如下所示:
Controller部分
public ViewResult Index2() { ViewBag.Message = "Hello ViewBag!"; ViewBag.Date=DateTime.Now; return View(); }
View 部分