----------------------------------------------
注:1.如果一个请求确实包含了一个参数的值,但又不能转换成正确的类型时,框架会传递参数类型的默认值,并将"ModelState"中
的这个参数名注册为一个验证错误。除非检查ModelState中的验证错误,否则,用户输入不良数据时,请求还是会被处理的
(以没用输入任何数据或输入默认值处理)。
2.现实中,有些MVC程序员会把每个动作方法的结果都定义为ActionResult ,哪怕他知道返回的是一个更具体的类型。(宽松性)
----------------------------------------------
一、控制器:只处理模型和视图职责的领域,而不处理事务、数据存储逻辑,不生成用户界面。
封装应用程序逻辑:负责处理输入请求、执行域模型上的操作,并选择渲染给用户的视图。
MVC框架通过读取由路由数据生成的controller属性值,确定目标控制器。
MVC框架会帮助用户对动作方法的参数(对参数名的处理是不区分大小写的)进行赋值,
通过检查上下文中的Request.QueryString、Request.Form,RouteData.Values对象获得。
二、Controller类三个关键特性:
1.动作方法(Action Method):控制器的行为是通过多个方法实现的。每个方法被暴露给不同的URL,并通过从输入请求的参数进行调用。
2.动作结果(Action Result):可以返回一个描述动作结果的对象,并能过该对象实现目的。(渲染一个视图,重定向到不同的URL,动作方法)
3.过滤器(Filter):可以把可重用的行为(认证)封装成过滤器,通过在源代码上放置一个[Attribute](注解属性),来标注到控制器或动作方法上。
三、Controller派生类的工作:1.实现动作方法,2.获取所需要的各种输入,3.对请求进行处理,4.生成合适的响应
1.接收输入:访问输入数据(查询字符串值、表单值),参数(由路由系统根据输入的URL解析所得)。
三个途径:1.通过一组上下文对象(context objects)进行提取。
2.作为参数(Parameters)被传递给动作方法而形成的数据。
3.明确地调用框架的模型绑定(Model Binding)特性。
(1)通过上下文对象攻取数据(在便利属性(Convenience Property)中获得):
常用的上下文对象
属性 | 类型 | 描述 |
Request.QueryString | NameValueCollection | 随该请求发送的Get变量 |
Request.Form | NameValueCollection | 随该请求发送的Postt变量 |
Request.Cookies | HttpCookieCollection | 由浏览器随该请求发送的Cookies |
Request.HttpMethod | string | 用于请求的HTTP方法(get、post、...) |
Request.Headers | NameValueCollection | 随该请求发送的整个HTTP报头 |
Request.Url | Url | 所请求的URL |
Request.UserHostAddress | string | 所请求用户的IP地址 |
RouteData.Route | RouteBase | 为该请求所选择的RouteTable.Routes条目 |
RouteData.Values | RouteValueDictionary | 当前路由参数(从URL或默认值提取) |
HttpContext.Application | HttpApplicationStateBase | 应用程序状态库 |
HttpContext.Cache | Cache | 应用程序缓存库 |
HttpContext.Items | Idictionary | 当前请求的状态库 |
HttpContextSession | HttpSessionStateBase | 访问者的会话状态库 |
User | Iprincipal | 已登录用户的认证信息 |
TempData | TempDataDictionary | 为当前用户存储的临时数据项 |
四、使用动作方法参数
1.参数对象实例化:Controller基类使用叫作“值提供器(Value Provider)”和“模型绑定器(Model Binder)”的MVC框架组件来获取动作方法的参数值。
值提供器抓取Request.Form、Request.QueryString、Request.Files、RouteData.Values的数据项传递给模型绑定器,
模型绑定器会尝试将这些数据映射成动作方法的参数的数据类型。
2.可选参数与强制参数:MVC框架在找不到引用类型(string、object等)的值时,动作方法的参数会使用null值来调用。
MVC框架在找不到值类型(int、double等)的值时,会抛出一个异常,且不调用动作方法。
强制参数:值类型;可选参数:引用类型。
值类型处理:(1)使用默认值;(2)可空类型(int? DateTime?)
引用类型处理:null判断,抛异常
可选参数可用于字面类型(不需要用new关键字定义的类型),包括string、int、double等。
五、动作结果(ActionResult)
1.动作结果系统是一种命令模式(Command Pattern)。描述场景,发送执行操作的对象。
命令模式用一个对象来表示和封装随后要调用的方法所需要的所有信息(对象、方法名、参数值)。
形成一个对象(封装了目标方法名、目标方法的对象、目标方法参数)来执行一个方法。
接收ActionResult对象->调用ExcuteResult方法->处理Response对象,生成输出。
内建的ActionResult类型
类型 | 描述 | 辅助器方法 |
ViewResult | 返回指定的或默认的视图模板 | View |
PartialViewResult | 返回指定的或默认的分部视图模板 | ParititalView |
RedirectToRouteResult | 将HTTP301(或302)重定向发送给一个动作方法或特定路由条目,根据路由配置生成一个URL |
RedirectToAction RedirectToActionPermanent RedirectToRoute RedirectToRoutePermanent |
RedirectResult | 将HTTP301(或302)重定向发送给一个特定的URL |
Redirect RedirectPermanent |
HttpUnauthorizedResult | 将响应的HTTP状态码设置为401(未授权),引发当前的认证机制要求访问者进行登录 | None |
HttpNotFoundRresult | 返回一个HTTP的“404-未找到”错误 | HttpNotFound |
HttpStatusCodeResult | 返回一个指定的HTTP码 | None |
EmptyResult | 什么也不做 | None |
2.重定向:
重定向到字面URL:Redirect(临时),RedirectPermanent(永久)
重定向到路由URL:RedirectToRoute(临时),RedirectToRoutePermanent(永久)
重定向到动作方法:RedirectToAction(临时),RedirectToActionPermanent(永久)
(注)为控制器和动作方法提供值,在被传递给路由系统之前是不会被检验的。用户要负责确保指定的目标是实际存在的。
Post/Redirect/Get 模式:接收一个Post请求,对该请求进行处理,然后重定向浏览器(302),以便由浏览器形成另一个Get请求的URL。
HTTP代码302:临时重定向。最常用。
HTTP代码301:永久重定向。指示HTTP代码接收器不要再请求原先的URL。(慎用)(RedirectPermanent)
3.保留重定向数据:重定向导致浏览器递交一个全新的HTTP请求,会失去对原先请求的细节的访问。可以用TempData特性。
(注)ViewBag不能用于跨请求的情况下。
TempData类似于Session数据,只不过TempData的值在被读取之后,即被标记为删除,并在该请求处理完成后删除。
可以使用TempData.Peek("Date")方法等到值,而不标记为删除。用TempData.Keep("Date")方法,保留到下次读取之前。
如果想存储一些数据在请求被处理后不被删除的话,请使用Session数据(注:Session会点用服务器资源,只有在会话过期后才会被删除)。
HTTP404:new HttpStatuscodeResult(404,"URL cannot be serviced") 或者(派生类)HttpNotFound()
HTTP401: new HttpUnauthorizedResult()