MVC(3)——Controller的动作方法使用View渲染Web界面

在MVC(1)中我们把Homecontroller原代码改为

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcDemo.Controllers
{
    public class HomeController : Controller
    {
        public String  Index()
        {
            return "Hello world";
        }
    }
}

最后的结果是在主页上显示一个Hello World;
MVC(3)——Controller的动作方法使用View渲染Web界面
我们发现是没有用到View的

之后我们变回了原来的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcDemo.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        { return View(); }

        public ActionResult About()
        { return View(); }
    }
}

在代码中 public ActionResult Index(){ return View(); }
当从动作方法Index返回一个ViewResult对象时,便是在指示MVC去渲染一个视图。调用不带参数的View方法,便可以创建这个ViewResult对象。这是在告诉MVC,去渲染该动作的默认视图。
而我们现在是没有View视图的(Views文件夹为空)
  如果此时运行该应用程序便可以看到,MVC框架正试图查找要使用的默认视图,并显示如下图所示的错误消息
  MVC(3)——Controller的动作方法使用View渲染Web界面
从这张运行结果图中我们可以看出
异常详细信息: System.InvalidOperationException: 未找到视图“Index”或其母版视图,或没有视图引擎支持搜索的位置。搜索了以下位置:
~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
我们HomeController的Index方法会搜寻视图Index文件,但是没找到
这是MVC约定的另一个很好的例子:视图是通过命名约定与动作方法相关联的。这个动作方法称为”Index”,控制器称为”Home”。从上图可以看出,MVC试图在”Views”文件夹中查找具有这一名称的不同文件。
因为这些位置都是空的所以运行错误。

我们获得的一个线索知识 :Controllers文件下的HomeController的Index动作方法(Return View),会去找Views文件夹下Home文件夹下的以Index为名的视图文件。
这个是默认视图规则,是MVC规定好的

下面就让我们在Views的Home下创建一个Index视图文件,让我们的HomeController可以找到,然后渲染我们的主页吧。

在HomeController.“文件的代码编辑窗口中定义Index动作方法的任意地方右击,然后从弹出的菜单中选择”AddView(添加视图)”。或者在Views的Home右键添加视图
MVC(3)——Controller的动作方法使用View渲染Web界面
MVC(3)——Controller的动作方法使用View渲染Web界面 “AddView(添加视图)”对话框中,让你配置待创建视图文件的初始内容。
将”Viewname(视图名)”设置为”Index”(与该视图相关联的动作方法的名称,这是另一个约定),将”Template(模板)”设置为”Empty(withoutmodel)”(空模板无模型),让”Createasapartialview(创建为分部视图)”和”Usealayoutpage(使用布局页)”复选框处于未选状态
然后单击”Add(添加)”按钮,创建这一新的视图文件。
随后我们打开Views\Home\Index.cshtml
初始代码如下

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

我们改为如下内容::

@{
    Layout = null;
}
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
      hello the view world
    </div>
</body>
</html>

具体来说就是
@{ Layout = null;}它告诉Razor未选用布局,布局类似于发送给浏览器的HTML模板。
然后就是一些一般的HTML语句,用来确定页面的显示内容。有 <head>标签显示页面标题;<body>显示页面主体内容,这里我们只放了一句话hello the view world

运行以下:
MVC(3)——Controller的动作方法使用View渲染Web界面
你可能会有疑问这和我们写那个返回值为String的Index函数有什么区别?
在最初编辑Index动作方法时,它返回的是一个字符串值。这意味着MVC除了把这个字符串值传递给浏览器之外,未做其他事情。
现在Index方法返回了一个ViewResult,MVC框架渲染了一个视图并返回了它所产生的HTML,可是代码中并 未告诉MVC应该使用哪一个视图,因此它会运用命名约定自动寻找一个视图。该约定是,视图具有动作方法的名称,并包含在以控制器命名的文件夹之中:Views/Home/Index.cshtml。
那么现在我们把Index文件还原回去

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

然后运行的结果是
MVC(3)——Controller的动作方法使用View渲染Web界面
之所以页面变的丰富了是因为我们的@{ViewBag.Title = “Index”;}代码引用了Views/Shared/_Layout.cshtml文件
MVC(3)——Controller的动作方法使用View渲染Web界面
至于这个又是如何工作的,我打算过几天在继续了解学习。
总结以下我们学到的知识:
当控制器中的动作方法Index返回一个ViewResult对象时,便是在指示MVC去渲染一个视图。调用不带参数的View方法,便可以创建这个ViewResult对象。这是在告诉MVC,去渲染该动作的默认视图(默认视图就是Views/控制器名/动作方法名.csthtml ;其他文件格式也可)

补充:

现在有很多人都把“渲染”说成“呈现”,其实这种说法是不正确的。
  Web页面从服务器到浏览器的整个呈现过程实际上分为三步:

第一步是通过视图引擎对视图文件进行解释,将视图文件中的代码转换成HTML标记,这一步叫做渲染;
第二步是将渲染后的HTML标记传递给客户端浏览器,这一步是页面的传递;
第三步是浏览器接收到HTML后对其进行处理并呈现为Web页面,这一步才叫做呈现。