渲染网页-Randering Web Pages

前面示例的输出结果不是HTML,而是一个“Hello World”的字符串。为了响应浏览器的请求产生一个HTML网页,我们需要创建一个视图(View)。


创建和渲染一个视图

我们所要做的第一件事就是要修改Index方法,修改后的代码如下所示:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6
7 namespace PartyInvites.Controllers
8 {
9 public class HomeController : Controller
10 {
11 public ViewResult Index()
12 {
13 return View();
14 }
15 }
16 }

需要修改的地方在上面的代码中已经加粗显示。当我们需要一个方法返回一个ViewResult对象时,我们就要使用MVC为我们渲染一个视图。我们通过调用没有参数的View()方法可以创建一个ViewResult对象。这就告诉MVC为这个方法去渲染一个默认的视图。

如果我们现在运行程序,我们可以看到MVC框架尝试着查找一个默认的视图进行渲染,下图为运行结果,显示了程序的错误信息:

这些错误信息是非常有用的,它不仅显示了MVC不能找到方法对应的一个视图,而写还显示了MVC所查找过的文件路径。这又是一个MVC规则的很好证明:视图通过命名的规则和控制器中的方法紧密的关联在一起。我们方法的名字为Index,控制器的名字为Home,从上图中我们可以看出,MVC机制试图在Views的文件夹下面查找不同的文件来查找与Index方法想关联的视图。

创建一个视图,停止调试,在HomeController.cs文件的Index方法中右击(在函数名或者函数代码的内部右击均可),在弹出菜单中选择“添加视图”。弹出的“添加视图”对话框如下图所示:

取消“使用布局或母版页”的选择。在这个示例中我们不使用布局,但是在以后的学习中会只用到布局。点击“添加”按钮,我们会看到Visual Studio在View/Home文件夹下创建了一个名字为Index.cshtml的文件。现在看一些前面运行时的错误,我们会发现新创建的这个文件正是MVC所要查找的目标文件。

提示:格式为.cshtml的文件时C#认为将要被Razor处理的一种视图文件。在MVC的之前版本中被称为ASPX视图引擎,文件的格式为.aspx。

Visual Studio在创建Index视图文件后自动打开该文件,我们可以进行编辑。我们将会看到该文件包含很多的HTML语言。唯一的例外部分看起来像这样:

1 @{
2 Layout = null;
3 }

这样的例外将会被Razor视图引擎所解释,这是一个很好的示例,这只是告诉Razor引擎我们没有使用母版页。现在我们先暂时的忽略Razor的相关知识,在以后的学习中会详细的讲解。在Index.cshtml文件中添加下面代码中加粗的部分:

 1 @{
2 Layout = null;
3 }
4
5 <!DOCTYPE html>
6
7 <html>
8 <head>
9 <meta name="viewport" content="width=device-width" />
10 <title>Index</title>
11 </head>
12 <body>
13 <div>
14 Hello World (from the view)
15 </div>
16 </body>
17 </html>

运行程序并且测试我们的视图,运行结果如下图所示:

在我们第一次编辑Index方法时,在运行结果中我们可以看到它返回的是一个字符串的值,也就是说MVC除了将一个字符串的值传递为浏览器之外没有做任何事情。现在Index方法的返回类型为ViewResult,我们使用MVC框架渲染了一个视图,并且返回的是一个HTML语言的网页。我们没有告诉MVC我们所要使用的视图,它确使用命名机制自动的查找到对应的视图。这种规则为:视图和方法的名字相同,并且视图文件存放在以控制器名字命名的文件夹下,如:~/Views/Home/Index.cshtml。

在控制器的方法中我们除了可以返回string类型和ViewResult类型外还可以返回一些其他的类型。例如:如果我们返回一个RedirectResult类型,将会导致浏览器重新定向到另外一个URL;如果我们返回一个HttpUnauthorizedResult,则会强制用户登录。这些对象称为执行结果,他们都来自ActionResult类。


增加动态输出-Adding Dynamic Output

一个完整的Web应用程序平台是可以创建并且可以动态输出数据的。在MVC中,控制器的作用就是创建或者手机数据并且把这些数据传递到视图中,可以在HTML进行渲染的时候进行展示。

一种从控制器向视图传递数据的方法时使用Controller基础类中的ViewBag对象。ViewBag是一种动态的数据类型,我们可以根据需要分配它的属性,这些属性可以在随后展现的页面中显示出对应的数据。下面的代码说明如何动态的在控制器和视图之间传递数据:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6
7 namespace PartyInvites.Controllers
8 {
9 public class HomeController : Controller
10 {
11 public ViewResult Index()
12 {
13 int hour = DateTime.Now.Hour;
14 ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";
15 return View();
16 }
17 }
18 }

在分配ViewBag.Greeting属性时,数据已经传递到对应的视图中。ViewBag只是一个动态对象的例子,它的Greeting属性只有在我们为它赋值后才存在,这使得我们在没有定义类的时候可以自由的将数据从控制器传递到视图中。

在视图中我们通过再次引用ViewBag.Greeting属性来获取它的值,将Index.cshtml文件中的代码修改为:

 1 @{
2 Layout = null;
3 }
4
5 <!DOCTYPE html>
6
7 <html>
8 <head>
9 <meta name="viewport" content="width=device-width" />
10 <title>Index</title>
11 </head>
12 <body>
13 <div>
14 @ViewBag.Greeting World (from the view)
15 </div>
16 </body>
17 </html>

上面代码中添加的内容是一个Razor表达式。当我们在控制器的Index方法中调用View()方法时,MVC框架将定位到Index.cshtml文件并要求Razor视图引擎解析文件的内容。Razor引擎查找到类似于上面我们所添加代码的形式并处理它们——也就是将我们在该视图对应的方法中为ViewBag.Greeting赋的值插入在视图中。

属性名字Greeting是没有特殊的要求的,我们可以用任意的属性名字来代替它,产生的效果是相同的。我们甚至可以分配多个是属性值来达到从控制器传递多个值到视图的目的。运行程序,查看一下动态MVC输出的效果:


---<本节完>---


ASP.NET MVC4 学习笔记-2的更多相关文章

  1. asp.net mvc4 学习笔记一(基本原理)

    做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...

  2. ASP.NET MVC4学习笔记路由系统概念与应用篇

    一.概念 1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段.ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段 ...

  3. ASP.NET MVC4学习笔记之总体概述

    断断续续使用ASP.NET MVC框架也有一年多了,也算积累了一些经验,唉,一直想写一些笔记好好总结一下,人太懒不想动笔,今天终于决定开始.希望自己能坚持下去. 这篇文章大体介绍ASP.NET MVC ...

  4. ASP.NET MVC4学习笔记之Controller的激活

    一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controlle ...

  5. ASP.NET MVC4学习笔记路由系统实现

    一.路由实现 路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总 ...

  6. ASP.NET MVC4学习笔记

    一.MVC简介

  7. ASP.NET MVC4学习笔记之Controller激活的扩展

    一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...

  8. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  9. [ASP.NET MVC] ASP.NET Identity学习笔记 - 原始码下载、ID型别差异

    [ASP.NET MVC] ASP.NET Identity学习笔记 - 原始码下载.ID型别差异 原始码下载 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授 ...

  10. ASP.NET MVC学习笔记-----Filter2

    ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...

随机推荐

  1. 服务器实现端口转发的N种方式

    简介 在一些实际的场景里,我们需要通过利用一些端口转发工具,比如系统自带的命令行工具或第三方小软件,来绕过网络访问限制触及目标系统.下文为大家总结了linux系统和windows系统端口转发常用的一些 ...

  2. ORA-17629: Cannot connect to the remote database server

    rman远程连接目标库,提示报错ORA-17629: Cannot connect to the remote database server,首先排查网络问题是否通路,结果发现目标端防火墙是开着的, ...

  3. 升级:In-Place Upgrade升级MySQL5.6.26

    升级需谨慎,事前先备份 MySQL升级的实质是对数据字典的升级,数据字典有:sys.mysql.information_schema.performance_schema . MySQL升级的两种方式 ...

  4. 浅析pcba测试

      说起PCB大家都很熟悉,那大家知道什么是PCBA吗?它是指将PCB板进行加工,支撑一个成品线路板.而PCBA测试就是对线路板进行一个功能测试.电路测试.那么为什么一定要对PAB板进行检测呢?它有什 ...

  5. Mysql8.0为什么取消了缓存查询的功能

    首先我们介绍一下MySQL的缓存机制 [MySQL缓存机制]简单的说就是缓存sql文本及查询结果,如果运行完全相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL. 但如果表中任何数 ...

  6. Linux修改远程命令端口

    Linux修改远程命令端口 执行以下命令,修改sshd服务的配置文件 vi /etc/ssh/sshd_config 找到port,默认是注释了的 22 打开注释,将22改成想要的端口号 重启服务 s ...

  7. LINUX经常使用的命令详解

    LINUX经常使用的命令详解 源地址:http://blog.itpub.net/29065182/viewspace-1189162/ 1.man 对你熟悉或不熟悉的命令提供帮助解释  eg:man ...

  8. C# 反射 操作列表类型属性

    本文介绍对列表进行创建及赋值的反射操作 我们现在有TestA.TestB类,TestA中有TestB类型列表的属性List,如下: 1 public class TestA 2 { 3 public ...

  9. iview中时间选择器组件改变日期格式

    //改变视图的显示格式,但不会改变value的值的格式 format="yyyy-MM-dd" //改变value值的格式 @on-change="anZhuangDat ...

  10. 2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}。 packag

    2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}. packag ...