《asp.net mvc3 高级编程》第二章 控制器
一、控制器的角色
MVC模式中的控制器(Controller)主要负责响应用户的输入,并且在响应时通常会修改模型(Model)。通过这种方式,MVC模式中的控制器主要关注的是应用程序流,输入数据的处理,以及对相关视图(View)输出数据的提供。
MVC是基于路由机制的,URL告知路由机制去实例化哪个控制器,调用哪个操作方法,并为该方法提供需要的参数。然后由控制器的方法决定使用哪个视图,并随后对该视图进行渲染。
URL与控制器(controller)类中的某个方法有关。理解MVC模式在Web场景中工作原理的一个好方法就是记住:MVC提供的是方法调用的结果,而不是动态生成的页面。
二、创建第一个非常简单的控制器
1、创建新控制器
首先打开上一张建立的MVC项目,然后在Controller文件夹上右击选择添加--控制器菜单项,如图2-1所示。

图 2-1
将控制器名为DemoController,选择”控制器“一项,如图2-2所示。

图 2-2
2、编写操作方法
在新创建的DemoController控制器已经有了一个Index方法,再在里面添加两个方法,分别为Browse和Details。这些方法在控制器里被称为控制器操作。他们的工作是响应URL请求,根据URL请求执行合适的操作,并向浏览器或者单击这个URL的用户做出响应。下面的操作步骤演示了控制器是如何工作的。
(1)将DemoController中的Index()方法的签名改为String(而不是ActionResult),然后将返回值改为”Hello from demo.Index()",如下所示:
public class DemoController : Controller
{
//
// GET: /Demo/ // public ActionResult Index() 改为:string
public string Index()
{
//return View(); 改为返回一个字符串。
return "Hello from demo.Index()";
} }
(2)添加Browse操作方法,将返回值设为“Hello from demo.Browse()",添加Details操作方法,将返回值为"Hello from demo.Details()"。DemoController完整代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcApplication1.Controllers
{
public class DemoController : Controller
{
//
// GET: /Demo/ // public ActionResult Index() 改为:string
public string Index()
{
//return View(); 改为返回一个字符串。
return "Hello from demo.Index()";
} // GET: /Demo/Browse
public string Browse()
{
return "Hello from demo.Browse()";
} // GET: /Demo/Details
public string Details()
{
return "Hello from demo.Details()";
} }
}
(3)启动运行项目,然后再浏览器地址栏下输入一下URL:
/Demo
/Demo/Browse
/Demo/Details
访问这些URL会调用控制器中所对应的操作方法,比如访问/Demo/Details 调用Demo 中的Details方法,然后返回响应字符串。如图2-3所示。

图 2-3
3、经验总结
(1)"http://localhost:35396/Demo/Details"中的Demo对应控制器(DemoController)中的前缀,Details对应DemoController类中的Details方法。URL请求/Demo/Details时,Details方法就可以得到执行,这就是操作中的路由。后面还会对路由稍作介绍,第9章将会详细讲解。
(2)已经利用一个控制器在浏览器里显示了文本而没有用到模型或视图。尽管在ASP.NET MVC中模型和视图非常有用,但控制器才是真正的核心。每一个请求都必须通过控制器处理,然而其中有些是不需要利用模型和视图。
三、有参数的控制器
(1)将Browse操作方法修改为检索一个从Url传过来的查询字符串值。当方法被调用时,ASP.NET MVC会自动将查询字符串或从表单提交的参数传递给Browse操作方法。如下面代码所示:
// GET: /Demo/Browse
public string Browse(string str)
{
string message = HttpUtility.HtmlEncode("Demo.Browse,Genre=" + str);
return message;
}
利用方法"HttpUtility.HtmlEncode"来预处理用户输入。这能阻止用户向视图中用连接注入JavaScript代码或者HTML标记。比如/Demo/Browse?Genre=<script>window.location="http://hacker.example.com"</script>.
(2)浏览到 /Demo/Browse?str=hello ,结果如图2-4所示。

图 2-4
(3)修改Details操作方法使其读取和显示一个名称为ID的输入参数。不像前面的方法那样把ID值作为一个查询字符串参数嵌入,这里是将ID值直接嵌入到URL中,如 /Demo/Deatila/5.
// GET: /Demo/Details
public string Details(int id)
{
string message = "Demo.Details,ID=" + id;
return message;
}
(4)运行程序,浏览/Demo/Details/5,结果如图2-5所示。

图 2-5
之所以直接在url请求/Demo/Details/5,是因为在ASP.NET MVC 默认路由约定好了,在Global.asax文件中可以找到: "{controller}/{action}/{id}", 具体什么意思再后面章节在讲解。
像前面的示例演示的那样,控制器操作感觉就好像是Web浏览器直接调用控制器类中的方法。类、方法和参数都被具体化为URL中的特定路径片段或查询字符串,结果就是一个返回给浏览器的字符串。这就是进行了极大的简化,但是平时我们很少返回原始的字符串,通常都是返回合适的ActionResult来处理像HTTP状态码和调用视图模板系统这样的事项。控制器通过URL被调用,然后执行自定义的代码并返回一个视图。下一章介绍控制器如何与视图结合使用。
小结:
控制器就是MVC应用程序的”指挥员“,他精心紧密地编排用户、模型对象和视图的交互。同时控制器还负责响应用户输入,操纵正确的模型对象,然后选择合适的视图显示给用户作为对最初用户输入的响应。
《asp.net mvc3 高级编程》第二章 控制器的更多相关文章
- 《asp.net mvc3 高级编程》第四章 模型
一,建立简单的Model 在Models文件夹上右击鼠标,选择“添加”,“类”,如下图所示: 建立三类相关联的类代码如下: public class Album { public virtual in ...
- 《asp.net mvc3 高级编程》第三章 视图
一.视图的作用 视图的职责是向用户提供界面.从ASP.NET MVC3开始,视图数据也可以通过ViewBag属性访问.例如:ViewBag.Message 就等于ViewData["Mess ...
- 《asp.net mvc3 高级编程》第一章
以前项目中用过mvc2,虽然mvc4早已出来,但手头只有mvc3的书籍,索性就学学MVC3吧. asp.net mvc 3 概述 (1)友好的试图表达,其中包括新的Razor视图引擎 (2)支持.NE ...
- 【读书笔记】C#高级编程 第二章 核心C#
(一)第一个C#程序 创建一个控制台应用程序,然后输入代码,输入完毕后点击F5 Console.WriteLine();这条语句的意思:把括号内的内容输出到界面上: Console.ReadKey() ...
- ASP.NET MVC5 高级编程 第2章 控制器
参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...
- ASP.NET MVC5 高级编程 第3章 视图
参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
随机推荐
- 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串
Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...
- 连接Oracle的几种方式
如何引用Data.OracleClient.dll 由于从.net 4.0之后,微软将OracleClient.dll从框架里去除了,所以要使用,需要在VS2010里面去把项目的.net框架从.net ...
- HDOJ 2081 手机短号
Problem Description 大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号.假设所有的短号都是是 6+手机号的后5位,比 ...
- [Locked] Wiggle Sort
Wiggle Sort Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= ...
- hdu 3409 最短路树+树形dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3409 参考博客:http://www.cnblogs.com/woaishizhan/p/318981 ...
- AGG 之贝塞尔插值
原文: http://liyiwen.iteye.com/blog/705489 之前 comp.graphic.algorithms 上有一个讨论,是关于怎么样使用曲线对多边形进行插值处理,使得最终 ...
- 301重定向与CNAME
CNAME记录是域名指向另一个域名A记录是域名指向IP地址URL跳转是打开这个网址的时候会跳转到另一个指定的网址,URL跳转分为301永久重定向和302临时重定向. 301永久重定向会使搜索引擎抓取新 ...
- Python监控日志程序
一个简易的日志监控的脚本,功能如下:1.windows环境2.当匹配日志关键字时会发出声音,匹配的关键字不同,播放的声音不同3.能做到实时响应 注意:是在win环境下哦 直接上代码吧 1 2 3 4 ...
- Android 更新UI的两个方法
Android 更新UI的两个方法 在Android的开发过程中,常常需要适时的更新UI.Androd中的UI是在主线程中更新的.如果在主线程之外的线程中直接更新,就会出现报错并抛出异常: andro ...
- SQL读取XML字段类型的信息
USE CSOS_NEW_2 GO --(1)定义临时表 DECLARE @table TABLE(id INT IDENTITY(1,1),XMLDetail XML) DECLARE @xml X ...