老罗学习MVC之旅:MVC组件分析
2System.Web.Mvc V 4.0.0.0 组件分析
2.1 Routing组件(路由选择)
Routing的作用就是负责分析Url

Action的要求
• 必须是一个公有方法
• 必须返回ActionResult类型
• 必须是实例方法
• 不能是范型方法
• 没有标注NonActionAttribute
• 不能被重载(overload)
2.2 Controller(控制器)

2.3控制器可用的ActionResult
ActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的是非ActionResult类型,控制器将会将结果转换为一个ContentResult类型。默认的ControllerActionInvoker调用ActionResult.ExecuteResult方法生成应答结果。
MVC中实现的默认ActionResult如下:
1、ContentResult: 返回简单的纯文本内容,可通过ContentType属性指定应答文档类型,通过ContentEncoding属性指定应答文档的字符编码。可通过Controller类中的Content方法便捷地返回ContentResult对象。如果控制器方法返回非ActionResult对象,MVC将简单地以返回对象的ToString()内容为基础产生一个ContentResult对象。
2、EmptyResult: 返回一个空的结果。如果控制器方法返回一个null,MVC将其转换成EmptyResult对象。
3、RedirectResult: 表示一个连接跳转,相当于ASP.NET中的Response.Redirect方法。对应的Controller方法为Redirect。
4、RedirectToRouteResult:同样表示一个调转,MVC会根据我们指定的路由名称或路由信息(RouteValueDictionary)来生成Url地址,然后调用Response.Redirect跳转。对应的Controller方法为RedirectToAction和RedirectToRoute。
5、ViewResult: 表示一个视图结果,它根据视图模板产生应答内容。对应Controller方法为View。
6、PartialViewResult: 表示一个部分视图结果,与ViewResult本质上一致,只是部分视图不支持母版,对应于ASP.NET,ViewResult相当于一个Page,而PartialViewResult则相当于一个UserControl。它对应的Controller方法为PartialView。
7、HttpUnauthorizedResult: 表示一个未经授权访问的错误。MVC会向客户端发送一个401的应答状态。如果在web.config中开启了表单验证(authentication mode="Forms"),则401状态会将Url转向指定的loginUrl链接。
8、JavaScriptResult: 本质上是一个文本内容,只是将Response.ContentType设置为 application/x-javascript,此结果应该和MicrosoftMvcAjax.js脚本配合使用,客户端接收到Ajax应答后,将判断Response.ContentType的值,如果是application/x-javascript,则直接eval执行返回的应答内容。此结果类型对应的Controller方法为JavaScript。
9、JsonResult: 表示一个JSON结果。MVC将Response.ContentType设置为application/json,并通过JavaScriptSerializer类将指定对象序列化为Json表示方式。需要注意,默认情况下,MVC不允许GET请求返回JSON结果,要解除此限制,在生成JsonResult对象时,将其JsonRequestBehavior属性设置为JsonRequestBehavior.AllowGet。此结果对应的Controller方法为Json。
10、FilePathResult、FileContentResult、FileStreamResult: 这三个类继承于FileResult,表示一个文件内容,三者的区别在于,FilePath通过路径传送文件到客户端,FileContent通过二进制数据的方式,而FileStream是通过Stream的方式来传送。Controller为这三个文件结果类型提供了一个名为File的重载方法。
通过直接或间接地从ActionResult继承,可实现自定义的结果类型.
2.4 View(视图)

2.5 ViewModel(视图模型)
HtmlHelper帮助类
用法大全
http://www.cnblogs.com/jyan/archive/2012/07/23/2604474.html
FormExtensions,
InputExtensions,主要有5种类型的扩展方法,分别用于CheckBox控件、Hidden控件、Pass控件、RadionButton控件和TextBox控件
LinkExtensions, 该类主要用于生成相关链接,主要扩展了ActionLink和RouteLink方法
SelectExtensions,
TextAreaExtensions,
ValidationExtensions,
RenderPartialExtensions
ActionLink:扩展方法主要实现一个连接,共有十个重载方法。
UrlHelper帮助类
看类名也都知道这个类是用来成URL在 ASP .NET MVC应用程序中。
UrlHelper提供了四个非常常用的四个方法。
1. Action方法通过提供Controller,Action和各种参数生成一个URL,
2. Content方法是将一个虚拟的,相对的路径转换到应用程序的绝对路径,
3. Encode方法是对 URL地址进行加密,与Server.Encode方法一样。
4. RouteUrl方法是提供在当前应用程序中规定的路由规则中匹配出URL。
另外还有两个属性,分别是RequestContext和RouteCollection两个属性,分别指的是包含HTTP上下文和RouteData两个属性,另外,RouteCollection是整个当前应用程序中规定的路由规则。
自定义控件
微软提供的HtmlHelper已经是足够大部分开发人员使用了,但是有一些功能要用微软提供的HtmlHelper可能还不满足要求。接下来就谈谈如何自定义的过程。
首先自定义的方法就是对HtmlHelper对象的扩展。
扩展方法实现的三要素:1、静态类 2、静态方法 3、this关键字
1、先定义一个类,例如:MyHtmlHelper:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcApplicationFirstDome.Models {
//静态类
public static class MyHtmlHelper
{
//静态方法
}
}
2、假设要扩展的方式是GetSpan,作用就是当你传入参数时,内部封装了之后返回结果,代码如下。注意在MyHtmlHelper类中要引用using System.Web.Mvc命名空间。
//静态方法
public static string GetSpan(this HtmlHelper htmlHelper,string text)
{
return "<span style='color:Red'>"+text+"</span>";
}
经过上面两步之后HtmlHelper的扩展方法GetSpan基本可以使用了,接下来就讲解如何在页面调用了。
2.6 Filters(过滤器)
ASP.NET MVC Framework支持四种不同类型的Filter:
1. Authorization filters – 实现IAuthorizationFilter接口的属性.
2. Action filters – 实现IActionFilter接口的属性.
3. Result filters – 实现IResultFilter接口的属性.
4. Exception filters – 实现IExceptionFilter接口的属性.
ActionFilterAttribute类有以下的方法可以重写:
· OnActionExecuting – 在controller action执行之前调用
· OnActionExecuted – 在controller action执行之后调用
· OnResultExecuting – 在controller action result执行之前调用
· OnResultExecuted – 在controller action result执行之后调用
执行的顺序如下图:
创建 Action filter 必须实现 IActionFilter 接口,它定义了两个方法:
|
方法名 |
调用时机 |
可进行的操作 |
|
OnActionExecuting |
Action方法执行之前 |
可以给 filterContext.Result 赋值,以阻止 Action 的执行 |
|
OnActionExecuted |
Action方法执行之后 |
可以通过 filterContext.Exception 获取 Action 执行时抛出的异常, 并能把它标记为“已处理”:filterContext.ExceptionHandled = true。 可以查看通过filterContext.Result查看 Action 的执行结果,但是不能修改。 |
下面就使用 OnActionExecuting 可以在 Action 方法执行前 能查看并修改参数值的特性 来完成敏感信息的过滤功能。
通过直接或间接地从ActionFilterAttribute继承,可实现自定义的结果类型.
老罗学习MVC之旅:MVC组件分析的更多相关文章
- 《老罗的Android之旅》导读PPT
虽然好几个月没更新博客了,但是老罗一直有在准备可以分享的东西的.除了早前在微博分享Android4.2相关技术之外,这次还特意准备了13个PPT,总结之前所研究过的东西.内容从Android组件设计思 ...
- 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务(老罗学习笔记6)
一:Eclipse下 1.创建工程: ---- 2.创建后目录 3.添加java函数 4.在src下创建package,在package下创建file 5.res---layout下创建xml文件,命 ...
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)
简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)一文中举例子说明了如何在 ...
- 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)
这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...
- 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序(老罗学习笔记2)
在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文 ...
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)
在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)
在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计
自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到很多同行的关注和支持,不过上一篇主要是介绍一个总体的界面效果和思路,本系列的文章将逐步介绍其中的 ...
- 【ASP.Net MVC】在AspNet Mvc使用JQuery AutoComplete组件
在AspNet Mvc使用JQuery AutoComplete组件 官方文档: http://api.jqueryui.com/autocomplete/#entry-examples 要使用JQu ...
随机推荐
- (原创)基于FPGA的调光流水灯(Verilog,CPLD/FPGA)
1.Abstract 前几天做了一个呼吸灯,觉得确实挺有意思的:可惜的是只有一个灯管亮,板子上有四个灯,要是能让这些灯有序地亮起来,那应该更有趣味了!跟传统的一样,逻辑上做成一个流水灯的样式, ...
- android和ubifs
原文地址: http://opendevkit.com/?e=37 1. ubifs号称性能比yaffs2 好,同时压缩可读写,文件系统image体较小同时可写,相当不错 2. ubifs制作 (1) ...
- redhat 6上nis配置
redhat 6上nis有点改动.在这里记一下 新装系统以后,首先要 yum install ypserv 安装ypserv的包 然后是设置 # 设置nis服务器名字 ypdomainname cen ...
- node-inspector:Failed to open socket on port 5858, waiting 1000 ms before retrying
输入: ps ax | grep node 对应PID为xxxxx 强制杀死进程: xxxxx 或者直接: killall node
- [Xamarin] 簡單使用AlertDialog (转帖)
這東西跟Toast 很像,有方便提示的作用 像是Windows 上面的MessageBox 或是 Javascript 的 Alert 會先阻斷使用者並且下一個決定 很簡單我就不贅述,基本上透過 Al ...
- [游戏模版20] Win32 物理引擎 加速运动
>_<:Compared with previous talk,there will be taking about how to create an accelerated speed. ...
- Neo4j:Data Model Transformation:From Relation To Graph
Here are some tips that help you with the transformation: Each entity table is represented by a labe ...
- R 中同步进行的多组比较的包:npmc
方差检验可以评估组间的差异.依据检验的结果,虽然你可以拒绝不存在差异的原假设,但方差检验并没有告诉你哪些组显著地与其他组有不同.Robert 在 <R in Action>一书中推荐了一个 ...
- java-一个小练习
输出自己的姓名: public class test01 { public static void main(String[] args) { System.out.println(" # ...
- PHP常用函数封装
//二分查找function bin_sch($array, $low, $high, $k){ if ($low <= $high) { $mid = intval(($l ...