ASP.NET MVC4 学习笔记-2
渲染网页-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的更多相关文章
- asp.net mvc4 学习笔记一(基本原理)
做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...
- ASP.NET MVC4学习笔记路由系统概念与应用篇
一.概念 1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段.ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段 ...
- ASP.NET MVC4学习笔记之总体概述
断断续续使用ASP.NET MVC框架也有一年多了,也算积累了一些经验,唉,一直想写一些笔记好好总结一下,人太懒不想动笔,今天终于决定开始.希望自己能坚持下去. 这篇文章大体介绍ASP.NET MVC ...
- ASP.NET MVC4学习笔记之Controller的激活
一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controlle ...
- ASP.NET MVC4学习笔记路由系统实现
一.路由实现 路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总 ...
- ASP.NET MVC4学习笔记
一.MVC简介
- ASP.NET MVC4学习笔记之Controller激活的扩展
一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...
- 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 ...
- [ASP.NET MVC] ASP.NET Identity学习笔记 - 原始码下载、ID型别差异
[ASP.NET MVC] ASP.NET Identity学习笔记 - 原始码下载.ID型别差异 原始码下载 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授 ...
- ASP.NET MVC学习笔记-----Filter2
ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...
随机推荐
- DG:有多个备库如何切换
问题描述:有一数据库准备进行主备switchover切换,但是有两个备库,其中最早一个备库状态已经出现GAP,第二个备库状态正常 SQL> show parameter log_archive_ ...
- Go语言网络编程:SSH连接
旨在提升Go语言网络编程能力 SSH是什么? SSH 为 Secure Shell 的缩写,为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SS ...
- 从 HTTP 到 gRPC:APISIX 中 etcd 操作的迁移之路
罗泽轩,API7.ai 技术专家/技术工程师,Apache APISIX PMC 成员. 原文链接 Apache APISIX 现有基于 HTTP 的 etcd 操作的局限性 etcd 在 2.x 版 ...
- 归并排序c++(逆序对)
归并排序c++(逆序对) 目录 题目链接 思路 算法 分离数组 合并 代码 目录 归并排序(Merge Sort)是建立在归并操作上的一种既有效又稳定的排序算法,该算法是采用分治法(Divide an ...
- [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测
文章目录 [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测 一.模型持久化 1.持久化代码实现 convert_variables_to_constants固化模型结 ...
- SpringBoot如何自定义一个starter
SpringBoot starter,大家应该在平常写项目中应该非常熟悉,很多依赖都会提供集成SpringBoot的依赖,这样我们用起来就非常顺手,开箱就能用,那如何自定义一个starter呢? Sp ...
- 云原生时代崛起的编程语言Go常用标准库实战
@ 目录 基础标准库 简述 字符串-string 底层结构 函数 长度 格式化输出 模版-template text/template html/template 正则表达式-regexp 编码-en ...
- 基于CentOS 7.6安装及配置APISIX 3.0环境
最近一直在研究微服务相关内容,通过对比各大API网关,发现新起之秀 APISIX无论从开源程度上来讲还是功能上,都拥有很大的优势. 经历了几天折磨一样的学习,目前在本地环境中配置成功了一套,以供自己留 ...
- Visual Basic 6 API压缩数据
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As ...
- 2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列。 t 中每两个 相邻 字母在字
2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列. t 中每两个 相邻 字母在字 ...