渲染网页-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. 深度剖析Redis九种数据结构实现原理,建议收藏

    1. Redis介绍 Redis 是一个高性能的键值存储系统,支持多种数据结构. 包含五种基本类型 String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),和 ...

  2. React+Antd在使用form表单提交DatePicker日期框的时候会出现少八小时的情况

    在使用antd做form表单提交的时候,突然发现了一个很有意思的bug.就是在使用datepicker组件日期框的时候会出现提交后少一天的问题 我在网上搜索了许多解决办法,也是困扰了我一天的时间,下面 ...

  3. windows系统git使用ssh方式和gitee/github进行同步

    前言 在从github/gitee远程仓库获取代码时,除了使用https方式,我们还可以使用ssh连接的方式与远程仓库服务器通信,其好处是有时会比https更方便.稳定.快速. 和与普通的linux服 ...

  4. 2021年蓝桥杯python真题-路径(数论+动态规划)(LCM、GCD和DP详细介绍)干货满满~

    欢迎大家阅读本文章 如果大家对LCM和GCD不是很熟悉,这篇文章将对你有帮助! 本文章也会把动态规划做一定的介绍 题目: GCD和LCM的讲解: GCD的实现-辗转相除法: 在数学中,辗转相除法,又称 ...

  5. 【故障公告】被放出的 Bing 爬虫,又被爬宕机的园子

    这些巨头爬虫们现在怎么了?记忆中2022年之前的十几年,园子没有遇到过被巨头爬虫们爬宕机的情况,巨头们都懂得爱护,都懂得控制节奏,都懂得在爬网时控制并发连接数以免给目标网站造成过大压力. 从去年开始, ...

  6. 笔记七:进程间的通信(IPC通信之信号灯)

    信号量 定义信号变量:  sem_t sem1 sem2 初始化信号量 P操作           V操作    功能 信号量(POSOX) 信号量灯(IPC) 定义信号变量 sem_t  sem1 ...

  7. [人脸活体检测] 论文:Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection

    Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection 论文简介 该论文提出的方法已经部署到百万台终端,整篇文章底气十足.作者设 ...

  8. 如何用 KMP 偏序 Z 函数

    KMP 算法求解字符串匹配的过程中 \(next\) 数组有着繁多的应用,主要是可以帮我们求 border. 然而用 \(s\) 串匹配 \(t\) 串产生的 \(f\) 数组应用相对较少. \(f\ ...

  9. 从案例中详解go-errgroup-源码

    一.背景 某次会议上发表了error group包,一个g失败,其他的g会同时失败的错误言论(看了一下源码中的一句话The first call to return a non-nil error c ...

  10. Prism Sample 23-RegionMemberLifetime

    在导航中跳转时,视图是缓存的.如果要求某视图在离开后就销毁,需要实现 public class ViewAViewModel : BindableBase, INavigationAware, IRe ...