MVC自学第二课
鉴赏一个软件开发框架最好的办法是投入其中并使用它。本课将使用ASP.NET MVC框架创建一个简单的数据录入应用程序。为简化起见,本课涉及到的一些技术细节在这里可能会跳过,会在以后的课程中再详细说明。
创建ASP.NET MVC 新项目
打开VS,在“文件”菜单中选择“新建项目”,我们选择“ASP.NET MVC 3 Web 应用程序” 如下图

将这个项目的名称设置为PartyInvties, 并点击“确定”按钮,你将看到另一个对话框,如下图所示。它让你在三个不同的MVC项目模板之间进行选择。

- “Empty(空)”模板选项只创建一个MVC 3 应用程序所需要的最少文件和文件夹。
- “Internet应用程序”选项创建一个小型的例子应用程序,你可以在它上面进行修改,并建立其他功能。它包括了用户注册与认证、导航、以及一个风格一致的视觉样式等。
- “Intranet应用程序”选项类似于“Internet应用程序”,但它是为通过域/活动目录体系结构进行用户认证的环境而设计的。
现在,选择“空”模板选项,让“使用HTML5语义标记”复选框为不选,点击确定按钮以创建这个新项目。
一旦VS创建了这个项目,你将在“解决方案资源管理器(Solution Explorer)”窗口中看到如下文件和文件夹,这是MVC 3项目默认的结构。

现在,直接F5试着运行一下这个应用程序,将会看到如下图所示的结果。

此应用程序尚未包含任何可以运行的东西,因此会看到一个”404——未找到资源“的提示屏幕。
添加一个控制器
在MVC体系结构中,传入的请求是由控制器处理的。在ASP.NET MVC中,控制器只是简单的C#类(通常继承自System.Web.Mvc.Controller,这是.NET框架内建的控制器基类)。在控制器中的每一个public方法都称为一个动作方法,也就是你可以用某个URL通过Web来调用它,以执行一个动作。MVC约定,把控制器放在一个名为Controllers文件夹中,这是VS在建立项目时为我们自动创建的。
要把一个控制器添加到项目,右击VS的“解决方案资源管理器”中的Controllers文件夹,并从弹出的菜单中选择“添加”——“控制器”,如下图所示

当“添加控制器”对话框出现时,将其命名为“HomeController”,如下图所示。这是一个约定:控制器的命名应当是有含义的,并以“Controller”结尾。

这个对话框的“基架选项”部分允许开发者用一个带有常规功能的末班创建一个控制器。这里暂时不适用这一特性,因此,确保在“模板”列表中选择了“空控制器”条目。
点击添加按钮,以创建这个控制器。VS会在Controller文件夹中创建一个新的C#代码文件,其名称为”HomeControllers.cs“,打开它以编辑。你可以看到这个类的名称为”HomeController“,而且,它派生于System.Web.Mvc.Controller。
using System.Web.Mvc; namespace PartyInvites.Controllers
{
public class HomeController : Controller
{ public string Index()
{
return "Hello World";
} }
}
个示例没有创建任何实际意义的东西,但这是MVC的一个良好开端。上面的代码中创建了一个名为”Index”的动作方法,它返回字符串”Hello World“。启动调试,会在浏览器中显示这个动作方法的结果,如下图所示

理解路由
同模型、视图、控制器一样,MVC应用程序也使用ASP.NET 的路由系统(Routing System),它决定如何把URL映射到特定的控制器和动作上。
当VS创建MVC项目时,它添加了一些默认的路由,以使开发者能够开始工作。你可以请求一下任何一个URL,它们都将被引向HomeController的Index动作上。
http://localhost:3316/Home/Index
在MVC中,客户端的所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Model中取数据,然后再由Controller选择合适的View返回给客户端。再说回前面我们运行的ASP.NET MVC程序访问的http://localhost:3316/Home/Index这个URL,它访问的其实是HomeController中的Index这个Action,见下图:

MVC遵循的路由约定你可以打开Global.asax.cs文件来查看和编辑路由配置

我们可以看到这里定义了一个名为"Default"的路由,还定义了默认的参数。默认参数的意义在于,当我们访问例如http://localhost:3316/的URL的时候,他会将不存在的参数用默认的参数补上,也就是相当于访问http://localhost:3316/Home/Index一样。
后面的课程还会详细讲解路由的配置和原理。
渲染Web页面
前面的例子的输出并不是HTML,只是一个字符串”Hello,World“。为了产生一个对浏览器请求响应的HTML,需要创建一个视图(View)。
创建并渲染一个视图
修改之前的控制器以渲染一个视图
using System.Web.Mvc; namespace PartyInvites.Controllers
{
public class HomeController : Controller
{
public ViewResult Index()
{
return View();
}
}
}
当我们从一个动作方法返回一个ViewResult对象时,便是在指示MVC去渲染一个视图。通过调用不带参数的View方法来创建这个ViewResult。这告诉MVC为这个动作去渲染一个默认视图。
如果此时运行这个应用程序,你可以看到,MVC框架正试图查找要用到的默认视图,并显示如下图所示的错误信息

从这个错误提示中我们可以看出,MVC试图在”View“文件夹中查找叫Index的文件,之前我们创建的示例的动作方法叫做”Index“,再联系MVC的路由工作原理,到这里我们视乎明白了一些。
用户在浏览器的地址栏中输入http://localhost:3316/Home/Index的一个URL请求,MVC路由会对这个URL进行解析,Home对应我们创建的HomeController控制器,Index对应该控制器内的Index方法,Index方法返回的是一个ViewResult对象,这其实就是在告诉MVC去渲染一个视图(默认视图【路由已配置】),但是MVC貌似在应用程序中没有找到相关的视图,所以就会报出以上的错误。
为了创建一个视图,右击HomeController.cs代码中的动作方法(在方法名上或方法体内),并从弹出菜单中选择”添加视图“,打开”添加视图“对话框,如下图所示

去掉”使用布局或母版页“复选框。点击”添加“按钮,VS将在View/Home文件夹中创建一个名为”Index.cshtml”的视图文件,如果返回上面图中的显示错误信息,你便能明白,刚刚创建的这个文件与它搜索的某个位置是匹配的。
(cshtml文件扩展名表示是一个由Razor[原谅我不知道怎么翻译这个单词,确实没找到合适的单词]处理的C#视图。MVC的早期版本建立在ASPX视图引擎之上,视图文件为.aspx扩展名)
打开Index.csHtml文件,你将看到如下所示的内容

把如下代码添加到Index.cshtml中
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div>
你好!哈哈O(∩_∩)O哈哈~(来自视图!)
</div>
</body>
</html>
(这里用HTML标记显示出来的信息,而不是前面那种由动作方法显示的字符串消息)
直接F5运行这个应用程序,可以看到类似→ →图所示的内容。
本课最初创建Index动作方法时,它返回一个字符串值,这意味着,MVC除了把这个字符串传递给浏览器之外,未做其他事情。现在Index方法返回一个ViewResult,这是指示MVC渲染一个视图并返回HTML。Index.ashtml中的代码并未告诉MVC应该使用哪个视图,其实它使用了命名约定,以自动一个视图。这个约定是,视图具有动作方法的名字,并位于以控制器命名的文件夹中——View/Home/Index.ashtml。
除了字符串和ViewResult对象之外,还可以从动作方法返回其他结果。例如,如果返回一个RedirectResult,可以使浏览器被重定向到另一个URL;如果返回一个HttpUnauthorizedResult,会强迫用户进行登录。这些对象统称为动作结果(Action Result),而且它们都是从ActionResult类派生而来的。动作结果系统是开发者能够封装并重用动作中常用响应。
好了,这节课就说到这里。后面继续!!!
MVC自学第二课的更多相关文章
- MVC自学第一课
了解传统的ASP.NET WebForm ASP.NET 在02年问世,给Web开发领域带来了巨大转变.下图描述了当时微软的技术堆栈. ASP.NET WebForm 技术堆栈 (注:此图的含义为,W ...
- C++自学第二课:对象和类的概念
既然是C++,比C语言多了最重要的概念:面向对象. 面向对象?对象是什么?Girlfriend? 我天天面向她也没学会C++. 我觉得对象就是有统一特征的一类编程目标. 打个比方说墙上有个开关,我一按 ...
- 微信小程序自学第二课:app及页面的生命周期、使用setData绑定数据
一.App声明周期 1.App() app.js中的App() 函数用来注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等. 示例代码: App({ onLaunch: fun ...
- CI(CodeIgniter)框架入门教程——第二课 初始MVC
本文转载自:http://www.softeng.cn/?p=53 今天的主要内容是,使用CodeIgniter框架完整的MVC内容来做一个简单的计算器,通过这个计算器,让大家能够体会到我在第一节课中 ...
- Asp.Net Web API 2(CRUD操作)第二课
Asp.Net Web API 2(CRUD操作)第二课 Asp.Net Web API 导航 Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok ...
- OpenCV 第二课 认识图像的存储结构
OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...
- Kali Linux Web 渗透测试视频教程— 第二课 google hack 实战
Kali Linux Web 渗透测试— 第二课 代理简介 文/玄魂 课程地址: http://edu.51cto.com/course/course_id-1887.html 目录 shellKal ...
- 【第二课】深入理解Handler
简要讲解Handler是做什么的 我们知道,在Android中,app启动会启动一个进程一个线程——UI线程,UI线程是主线程,并且不允许这个线程阻塞超过5秒,一旦超过5秒就会ANR. 所以较为耗时的 ...
- ruby代码重构第二课
(文章都是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在第一课里提取出了相通的代码,第二课里就把常量提取出来吧 一般把常量的定义写的对应的app/mo ...
随机推荐
- 关于 zend studio 中有些php 内置函数没有提示,或是有‘小黄色感叹号’
解决办法: 1.修改项目 .buildpath 文件 <?xml version="1.0" encoding="UTF-8"?> <buil ...
- Python下的机器学习工具sklearn--数据预处理
1.数据标准化(Standardization or Mean Removal and Variance Scaling) 进行标准化缩放的数据均值为0,具有单位方差. from sklearn im ...
- Android02-Activity01
1.概念:活动是一种可以包含用户界面的组件, 主要用于和用户进行交互. 2.常见操作: 1.隐藏Activity的标题栏: @Override protected void onCreate ...
- xml 解析 Xstream
1.概述 json 解析可以使用gson包解为现成的对象,那么xml可以不可以用现成的包解析成java的对象呢? 带着这个问题,查询了一些材料找到了Xstream解析方法,确实可以完成这种思考,只是实 ...
- gulp api
gulp api 简介 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 gulp是基于Nod ...
- 前端js模板库 JinkoTemplate
有时候需要使用ajax来异步生成html,最土的方法就是用js的‘+’连接html代码,生成繁琐.一旦需要修改,对于少量的html代码到没啥问题,要是比较复杂的样式时,就真坑爹了,眼花缭乱有木有?Ji ...
- hdu 2769 uva 12169 Disgruntled Judge 拓展欧几里德
//数据是有多水 连 10^10的枚举都能过 关于拓展欧几里德:大概就是x1=y2,y1=x2-[a/b]y2,按这个规律递归到gcd(a,0)的形式,此时公因数为a,方程也变为a*x+0*y=gcd ...
- nginx启动关闭
[root@localhost sbin]# ./nginx -s reload [root@localhost sbin]# ./nginx -s stop [root@localhost sbin ...
- 最短路(dijskra+SPFA+Bellman)
最短路 Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- 项目积累——Blockingqueue,ConcurrentLinkedQueue,Executors
背景 通过做以下一个小的接口系统gate,了解一下mina和java并发包里的东西.A系统为javaweb项目,B为C语言项目,gate是本篇须要完毕的系统. 需求 1. A为集群系统,并发较高,会批 ...