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可以基于任何目的使用 ...
随机推荐
- mariadb修改用户host的两种方式
问题描述:使用update user set host='%' where user='root';修改用户host失败.根据提示mariadb不在是一个基表,而是一张视图,无法被直接修改.mysql ...
- Kubernetes(K8S) kubesphere 安装
安装KubeSphere最好的方法就是参考官方文档,而且官方文档是中文的. 官网地址:https://kubesphere.com.cn/ https://github.com/kubesphere/ ...
- UniApp小程序开发项目创建与运行
1.准备工作:HbuiderX + 微信开发者工具下载安装+小程序账号申请开通(这里就不例举了,可以看同账号uniapp小程序开发准备) 2.创建项目 新版本的HbuilderX点击新建项目--选 ...
- LeetCode 654:最大二叉树
先立个flag吧,坚持每日刷题的小目标,希望自己能坚持下来,如果有需要一起打卡的uu,可以一起监督哈,在菜鸡的路上慢慢变好 题目:最大二叉树 给定一个不重复的整数数组 nums . 最大二叉树 可以用 ...
- Yolov5 根据自己的需要更改 预测框box和蒙版mask的颜色
1.首先找到项目中 utils/plots.py 文件,打开该代码 将原来的 Colors类注释掉(或删掉),改成如下Colors类 class Colors: def __init__(self): ...
- Linux 给用户赋予操作权限
赋予local目录读写权限给keesail,别的用户对这个目录没有任何权限. chown -R keesail:keesail ./local chmod 777 文件夹名称,可以把文件夹设置成所有用 ...
- 2022-04-23:给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 集合 或者 B 集合中 使得 A 集合和 B 集合不为空,并且 average(A) == aver
2022-04-23:给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 集合 或者 B 集合中 使得 A 集合和 B 集合不为空,并且 average(A) == aver ...
- 2021-04-23:TSP问题 有N个城市,任何两个城市之间的都有距离,任何一座城市到自己的距离都为0。所有点到点的距 离都存在一个N*N的二维数组matrix里,也就是整张图由邻接矩阵表示。现要求
2021-04-23:TSP问题 有N个城市,任何两个城市之间的都有距离,任何一座城市到自己的距离都为0.所有点到点的距 离都存在一个N*N的二维数组matrix里,也就是整张图由邻接矩阵表示.现要求 ...
- flask目录结构
- 限速神器RateLimiter源码解析
作者:京东科技 李玉亮 目录指引 限流场景 软件系统中一般有两种场景会用到限流: •场景一.高并发的用户端场景. 尤其是C端系统,经常面对海量用户请求,如不做限流,遇到瞬间高并发的场景,则可能压垮系统 ...