到达应用程序的每一个请求都是由控制器处理的。只要不偏离到属于模型和视图职责的领域,控制器可以以它认为合适的方式自由地处理请求。
在ASP.NET MVC框架中,控制器是含有请求处理逻辑的.NET类。控制器的作用是
1.负责处理输入请求
2.执行域模型上的操作
3.选择渲染给用户的视图
创建一个控制器,需要实现IController接口或继承Controller类
1.使用IController创建控制器
在Controller文件夹下,添加一个类文件:BasicController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVC_Project05.Controllers
{
public class BasicController : IController
{
public void Execute(RequestContext requestContext)
{
string controllerName = requestContext.RouteData.Values["controller"].ToString();
string actionName = requestContext.RouteData.Values["action"].ToString();
if (actionName.ToLower()=="redirect") {
//重定向到指定的URL:底层还是动作方法的调用 requestContext.HttpContext.Response.Redirect("/Derived/Index");
}
requestContext.HttpContext.Response.Write(
string.Format("Controller:{0},Action:{1}",controllerName,actionName)
);
}
}
}
Result:
输入地址:
跳转到的页面:
IController接口,是一个很简单的接口,唯一的方法Execute,在请求以控制器类为目标被调用。
IController接口
Execute ()方法接收的是一个System.Web.Routing.RequestContext requestContext对象,该对象它提供关于当前请求与匹配路由的信息(导致控制器被调用处理请求)。
HttpContext属性 返回一个描述当前请求的HttpContextBase对象
RouteData属性 返回一个描述匹配请求路由的RouteData对象
RouteData对象描述了路由,有几个比较重要的属性:
Route 返回匹配路由的RouteBase实现
Values 返回按命名索引的片段值的集合
总结1:
实现IController接口所创建的类,MVC框架会将其视为是一个控制器,并将请求发送给它,而且在处理请求和响应请求上没有任何限制。
2.创建派生于Controller的控制器
使用Controller类,用来支持对请求处理提供支持的类。
Controller类提供以下三个关键特性:
1动作方法(Action Method):一个控制器的行为被分解成多个方法
(而不是只有一个单一的)。每个动作方法被暴露给不同的URL,并通过从输入请求提取的参数进行调用。
2.动作结果(Action Result):可以返回一个描述动作结果的对象(例如:1.渲染视图 2.重定向到一个不同的URL或动作方法)
除非你有一个非常明确的需求,创建控制器的最好方法就是通过Controller类进行派生,Controllers文件夹–>添加(右击)---->控制器
Demo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVC_Project05.Models;
namespace MVC_Project05.Controllers
{
public class DerivedController : Controller
{
// GET: Derived
public ActionResult Index(int num=0)
{
ViewBag.Message = "Hello from the DerivedController Index Method";
return View("MyView");
}
}
}
在Views文件下的子文件夹Derived下,添加MyView视图文件:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>MyView</title>
</head>
<body>
<div>
Message:@ViewBag.Message
</div>
</body>
</html>
Result:
总结2:
作为Controller类的一个派生类,所要做的工作就是实现动作方法、获取所需要的各种输入,以对请求进行处理,并生成一个适当的响应。
3.接收请求参数
控制器经常需要访问来自于输入请求的数据,如查询字符串、表单值、以及路由参数,访问这些数据有三个主要的途径:
1.通过一组上下文对象进行提取
2.作为参数(Parameters)被传递给动作方法而形成的数据
3.明确地调用框架的模型绑定
具体的用法,请看下面之前写的两篇文章:
MVC中几种常用传参方式以及在后台中获取客户端请求参数值
ASP.NET 几种常用的页面传值的方式
理解参数对象实例化:
Controller基类使用叫做"值提供器"和"模型绑定器"的MVC框架组件来获取动作方法的参数。有一组内建的值提供器,会抓取Request.Form、Request.QueryString、Request.Files以及RouteData.Values的数据项。
默认的模型绑定器能够创建并填充任何.NET类型的对象,包括集合和项目专用的自定义类型。
理解可选参数和强制参数:
如果MVC框架找不到引用类型参数(如string或object)的值,动作方法仍然会被调用,但对参数会赋null值。若找不到值类型(如int或double)的值,则会抛出异常且不会被调用。
1.值类型参数是强制的,调用Action动作方法时,必须传入,为了使其成为可选,可以给参数指定一个默认值
Demo:
public ActionResult Index(int num=0)
{
................................
................................
}
2.引用类型参数是可选的,为了使它们成为必需的(以保证传递一个非空值),比如;可以抛出一个ArgumentNullException