理解控制器
中转作用
-
承上启下,根据用户输入,执行响应行为(动作方法)
-
在行为中调用模型的业务逻辑,并返回给用户结果(视图)
中介角色
-
分离视图和模型,让视图和模型各司其职,控制器赋值二者交互
-
只负责数据的传送,不负责处理
控制器类
所有的控制器的基类都是Controller,而Controller类重点就是提供ASP.NET MVC网站进行的http请求的方法
而Controller自身具有的基类是ControllerBase
ControllerBase类
-
Controller类位于System.Web.Mvc命名空间,继承自ControllerBase类
-
ControllerBase类实现了Icontroller接口的Execute方法,在路由搜索到相应的控制器及动作方法,Execute方法进入控制器的处理
属性
-
ControllerContext:获取或设置控制器上下文
-
ValidateRequest:获取或设置一个值,该值指示是否为此请求启用请求验证
-
ValueProvider:获取或设置控制器的值
-
ViewData:获取或设置数据的字典
-
ViewBag:获取动态视图数据字典
-
TempData:获取或设置可以在不同控制器之间传递数据的字典
任务
-
定位:找到相应的动作方法
-
获取参数:获取动作方法的参数
-
处理错误:在执行动作方法中可能出现的错误
-
渲染视图:提供默认的WebFormViewFactory类来渲染ASP.NET视图
动作方法的参数
动作方法参数映射
-
在动作方法中使用“参数映射”,参数会自动匹配
-
参数映射的好处:再也不需要手工获取参数并做类型转换,在多个参数时非常明显
映射参数的来源
来源 | 优先级 | 说明 |
---|---|---|
表单数据 | 高 | 表单提交的数据(Request.Form) |
路由数据 | 中 | 路由数据(RouteData.Values) |
URL数据 | 低 | URL数据(Request.QueryString) |
参数自动映射,按照优先级依次查找参数
动作方法参数要求
-
动作方法的参数必须和数据模型中的属性类型、名称保持一致(大小写不区分)
-
视图中的表单name属性值或URL中键值对名称和数据模型中属性名称保持一致
-
满足三方面的命名一致才能实现参数映射
-
如果视图中表单或URL或路由数据只要能够确保是一个数据模型,那么就能够在动作方法中直接使用这个数据模型对象作为参数
值类型参数映射失败
解决方案:可以将值类型定义为可空类型,可选参数
动作方法的特性
例如控制器中出现动作方法重载
路由系统不能根据方法参数去定位动作方法
Http请求特性
针对请求类型定位方法,解决同名冲突问题
特性名 | 说明 |
---|---|
HttpGet | 针对Get请求 |
HttpPost | 针对Post请求 |
HttpDelete | 针对Delete请求 |
HttpPut | 针对Put请求 |
关于Http谓词
-
特点:经常使用,如果不加上该特性,默认动作方法接收所有谓词的请求
-
一般开发中都会加上谓词,限定请求谓词类型
NonAction特性
-
可以将控制器中的方法声明为“非动作方法”
-
对于控制器内部使用的方法非常有用,加上该特性后,外部不能访问,也可以解决同名方法冲突问题
ActionName特性
-
为动作方法“重命名”,解决同名方法冲突问题
-
视图中使用时,需要修改成“重新命名”后的方法
注意:当动作方法应用了ActionName特性后,如果动作方法内部使用View()方法调用视图,(也就是不指定视图名称),则调用的是和ActionName值相同的视图,而不再是原动作方法名称视图
ActionResult详解
ActionResult和View()
所有的View()方法返回的都是ViewResult对象
名称 | 说明 |
---|---|
View() | 创建一个将视图呈现给响应的ViewResult对象 |
View(Object) | 使用模型创建一个将视图呈现给响应的ViewResult对象 |
View(string) | 使用视图名称创建一个呈现视图的ViewResult对象 |
View(IView) | 创建一个呈现指定的IView对象的ViewResult对象 |
View(string,object) | 使用模型创建一个指定视图名称的ViewResult对象 |
View(string,string) | 使用视图名称和母版页名称创建一个将视图呈现给响应的ViewResult对象 |
View(IView,object) | 创建一个呈现指定的IView对象的ViewResult对象 |
View(string,string,object) | 使用视图名称、母版页、和模型创建一个呈现视图的ViewResult |
返回值是一个抽象类,体现了多态性,多态性解决了实际开发中响应结果为html、文件等不同内容的输出
从动作方法输出内容
当客户端不需要输出HTML,而是文件、文本内容等该怎么办
输出类型 | 说明 | 控制器输出的方法 |
---|---|---|
EmptyResult | 没有返回值,动作方法不需要输出 | 无 |
ContentResult | 将指定内容作为文本输出 | Conten(string) |
JsonResult | 输出JSON字符串 | Json(object) |
JavaScriptResult | 输出JavaScript文件 | JavaScript(string) |
RedirectResult | 指定的URL来执行重定向 | Redirect(string) |
RedirectToRouteResult | 指定路由值来执行查询 | RedirectToAction(string) |
FilePathResult | 指定文件路径来输出文件 | File(string ,string) |
FileContentResult | 指定字节数组来输出文件 | File(byte[],string) |
FileStreamResult | 指定流来输出文件 | File(Stream,string) |
ViewResult | 调用视图文件输出视图 | View() |
隐式动作类型
-
动作方法返回值类型可以是ActionResult以外的任意类型
-
类型说明
int类型--->ContentResult类型
void类型--->EmptyResult类型