我的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 代码:

 1 using System;
 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()方法的返回值类型和返回值如下:

 public string  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将有三个功能:

 

    1. 音乐风格列表;
    2. 某一风格的所有音乐;
    3. 某一音乐的详细信息;
现在,停止应用程序的运行,添加一个新的控制器:StoreController

 

新的控制器创建完之后有一个默认方法:Index(),我们将用它来返回所有风格列表,并且,我们要添加另外两个方法:

Browse:用来浏览某一风格的音乐列表;

Details:用来查看单个音乐的详细信息;

这三个方法叫做“Controller Actions”,他们都要处理URL请求并且将处理结果反馈给浏览器;

添加好之后的三个方法如下(简单起见,还是先用字符串开始):

 1 using System;
 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 参数传进来。

  更新后的方法:

1 //
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):

1         
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         } 

  重新生成并执行:

执行结果可以看出,的确如此。

到这里,本节已经基本结束,回顾一下:

 

    1. 建立一个新的Asp.net Mvc 应用程序;
    2. 介绍Mvc的基本文件目录结构;
    3. 运行Mvc程序;
    4. 添加控制器:HomeController和StoreController;
    5. 接收URL参数并返回处理结果到浏览器;

 

后记

本节简单介绍了控制器工作的基本流程,入手非常简单,堪称Mvc HelloWord。其实原理非常简单:Mvc以及Route路径控制直接把请求解析到控制器方法(关于这点可以查看:http://www.cnblogs.com/artech/archive/2012/03/26/mvc-routing-01.html 将有助于理解MVC路由映射),控制器处理之后返回到视图,解析完成之后返回给浏览器。下篇将介绍试图和模型。

posted @ 2012-09-08 17:10  JackZ  阅读(2713)  评论(9编辑  收藏  举报