我的MVC之旅(2)--------MVC Music Store 第二篇 controller 控制器 [翻译]
前言
前一篇介绍了MVCMusicStore的开篇介绍,还有人捧场,非常Happy,所以,今天继续。
概述
第二篇要讲的是控制器,先看看源文章对控制器的简述:首先是说URL,传统web框架都是URL对应物理文件(当然这里是排除URL重写技术),比如“/Products.aspx”或者"/Products.php"肯定对应网站目录下的“/Products.aspx”或者"/Products.php"文件。
但是,基于WEB的MVC框架把RequestUrl 映射到服务端代码的方式不同,它直接把URL对应到类里面的方法,不是网页文件或者资源,而是方法,这些方法就是【控制器】,控制器负责处理传入的HTTP请求,接收用户的表单数据,检索或者保存数据,确定返回到浏览器的内容,一个新的动态HTML或者下载文件,或者跳转等。
个人观点:我觉得controller功能有点像业务逻辑层,负责核心的任务,处理,但是 又不全是。这里可以读一下这篇文章:MVC与三层架构的终极区别
内容
添加第一个控制器
// 备注:前一篇的截图都是运行结果和安装软件的步骤,所以没有亲自截图,从本篇开始,所有截图全部是我自己边做边写,我用的是WIN8+VS2012,希望大家看着不会别扭。
开始为MVCMusicStore添加第一个控制器,命名为“HomeController”,右键 Controllers 文件夹 添加 选择 控制器
可以看到添加好之后的HomeController 代码:
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6
7 namespace MvcMusicStore.Controllers
8 {
9 public class HomeController : Controller
10 {
11 //
12 // GET: /Home/
13
14 public ActionResult Index()
15 {
16 return View();
17 }
18
19 }
20 }
为了更简单一点,我们更改 Index()方法的返回值类型和返回值如下:
{
return "Hello from Home";
}
现在可以第一次运行项目了,按F5或者点击绿色箭头:
运行之前会编译,之后会调用内置的Asp.net 开发版服务器, 右下角显示通知,包括应用程序端口以及启动/停止操作。
然后,会自动打开浏览器访问我们的应用程序如下图:
怎么样?很简单吧,不过,这只是开始!
备注:VS自带Asp.net 服务器, 它将会为我们的应用程序随机配置一个端口号,比如我的就是21222,当然你的也可能是别的,但是都一样,本系列教程里的路径都是基于http://locaohost:21222/的,比如/Store/Browse,就是http://locaohost:21222/Store/Brows
其实这里和之前的IIS差不多,就是废话。
添加一个 新的控制器 StoreController
我们已经添加了一个非常简单的HomeController实现在我们的网站的首页,现在,添加另一个控制器用来实现音乐浏览功能,StoreController将有三个功能:
- 音乐风格列表;
- 某一风格的所有音乐;
- 某一音乐的详细信息;
新的控制器创建完之后有一个默认方法:Index(),我们将用它来返回所有风格列表,并且,我们要添加另外两个方法:
Browse:用来浏览某一风格的音乐列表;
Details:用来查看单个音乐的详细信息;
这三个方法叫做“Controller Actions”,他们都要处理URL请求并且将处理结果反馈给浏览器;
添加好之后的三个方法如下(简单起见,还是先用字符串开始):
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6
7 namespace MvcMusicStore.Controllers
8 {
9 public class StoreController : Controller
10 {
11 //
12 // GET: /Store/
13 public string Index()
14 {
15 return "Hello from Store.Index()";
16 }
17 //
18 // GET: /Store/Browse
19 public string Browse()
20 {
21 return "Hello from Store.Browse()";
22 }
23 //
24 // GET: /Store/Details
25 public string Details()
26 {
27 return "Hello from Store.Details()";
28 }
29
30 }
31 }
直接按Shift + F6重新生成,或者直接按F5运行程序,完成之后,在浏览器打开:
- /Store
- /Store/Browse
- /Store/Details
将分别看到相应方法的返回值,和HomeController一样。
怎么样?感觉不错吧,不过这些都是一些直接的值,我们给他扩展一下让他变成动态的,能够接收数据、处理并返回到浏览器。
首先我们为Browser方法添加一个genre参数 用来接收Url的参数,这样当mvc 解析器调用Browse方法时就会自动把URL里的 genre 参数传进来。
更新后的方法:
2 // GET: /Store/Browse?genre=Disco
3 public string Browse(string genre)
4 {
5 string message = HttpUtility.HtmlEncode("Store.Browse, Genre = "
6 + genre);
7
8 return message;
9 }
备注:HttpUtility.HtmlEncode方法用来给输入数据“消毒”,防止用户注入类似 /Store/Browse?Genre=<script>window.location=’http://hackersite.com’</script>的javascript程序
现在,重新生成并且访问: /Store/Browse?Genre=Disco
从第二个运行结果可以看出,的确是可以防止JS注入的。
现在我们为Details加入参数:ID。这里要特别提示:Asp.netMvc规则允许参数名为ID的参数在URL中不用输入参数名,而直接传入参数:(/store/details?id=5)Equals(/store/details/5):
2 //
3 // GET: /Store/Details/5
4 public string Details(int id)
5 {
6 string message = "Store.Details, ID = " + id;
7
8 return message;
9 }
重新生成并执行:
执行结果可以看出,的确如此。
到这里,本节已经基本结束,回顾一下:
- 建立一个新的Asp.net Mvc 应用程序;
- 介绍Mvc的基本文件目录结构;
- 运行Mvc程序;
- 添加控制器:HomeController和StoreController;
- 接收URL参数并返回处理结果到浏览器;
后记
本节简单介绍了控制器工作的基本流程,入手非常简单,堪称Mvc HelloWord。其实原理非常简单:Mvc以及Route路径控制直接把请求解析到控制器方法(关于这点可以查看:http://www.cnblogs.com/artech/archive/2012/03/26/mvc-routing-01.html 将有助于理解MVC路由映射),控制器处理之后返回到视图,解析完成之后返回给浏览器。下篇将介绍试图和模型。