ASP.NET MVC(二)
程序员文章站
2022-06-12 08:26:04
...
ASP.NET mvc控制器
- 控制器是ASP.NET MVC应用程序的中心单元,控制器是第一个请求接收者,与传入的HTPP请求进行交互,
- 控制器决定选择哪个模型,然后从模型中获取数据,并将数据传递给相应的视图,然后渲染视图
- 实际上,控制器控制应用程序的整体流程,并输出正确的输出
- 控制器继承自
System.Web.mvc.controller
的c#,是内置的控制器基类,控制器中的每个公共方法都统称为一个操作方法,可以通过某个URL从Web调用控制器执行操作 - MVC约定将控制器放在项目创建时默认的文件夹
Controllers
中 - 当参数传递时,要从浏览器获取传入值,MVC框架通过操作方法内部的参数解决获取传入值的问题
- 如果将一个添加到操作方法中,则MVC框架将查找与参数名称匹配的值,MVC框架将应用所有可能的组合找出参数值,MVC将搜索路由数据,查询字符串等
APP_Start中的路由配置页面
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVC
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// 在默认生成的环境中配置自己的路由-自定义路由
// 任何用户来到并搜索雇员,指定URL为Employee/Maxsu。
// 在这种情况下,Maxsu将被视为参数名称,而不是操作的方法。
// 所以在这种情况下,默认路由将不会工作显示
// 请求:/Employee/Maxsu,那么MVC框架将决定需要一个带有UserInput的参数,然后Maxsu会从URL中挑选出来并自动传递。
routes.MapRoute(
"Employee", "{Employee}/{name}",
new { controller = "Employee", action = "Search", name = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
EmployeeController内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVC.Controllers
{
public class EmployeeController : Controller
{
// GET: Employee
public ActionResult Search(String name)
{
// Server.HtmlEncode将简单地转换任何形式的纯文本恶意脚本
// 从URL中截取我们所请求的页面名称的脚本
var input = Server.HtmlEncode(name);
return Content(input);
}
}
}
ASP.NET MVC动作
- ASP.NET MVC操作方法负责执行请求并生成响应,默认情况下MVC操作方法以
ActionResult
的形式生成响应,操作动作通常具有与用户交互的一对一映射 - 例如:在浏览器中输入URL,点击任何特定链接,提交表单等,用户交互中的每一个动作都会导致请求被发送到服务器,在这种情况下,请求的URL都包含MVC框架用来调用操作方法的信息
- 动作方法的限制是动作方法必须是实例方法,动作方法不能是静态方法,也没有返回值的限制,所有可返回字符串,整数等
请求处理
- 动作是MVC应用程序的最终目标,动作使用控制器基类,使用请求处理的过程如下
- 当URL到达时,如
/Home/index
,这是UrlRoutingModule
,检查并理解路由表中配置的内容,以及如何处理该URL -
UrlRoutingModule
将在路由表中配置的信息放在一起,并叫那个控制交给MVC路由处理程序 - MVC路由处理程序将控制器传递给作为HTTP处理程序的
MvcHandler
-
MvcHandler
使用一个控制器工厂实例化控制器,MvcHandler
知道实例化哪个个控制器,MvcHandler
在该控制器值的RouteData
中查找 - 当
MvcHandler
有一个控制器,MvcHandler
唯一知道的就是IController
接口,所以MvcHandler
指示告诉控制器执行 - 当
MvcHandler
告诉控制器执行时,是从MVC
的控制器基类派生的,Execute方法
创建一个动作调用者,并告诉动作调用者去找一个方法去调用,找到调用的动作 - 动作的调用者再次从
RouteData
中查找并找到从路由引擎传递的动作参数
动作类型
- 动作基本上返回不同类型的动作,
ActionResult
类是所有操作结果的基础 - 不同种类的行为结果及其行为的列表如下所示
-
ContentResult
:返回一个字符串 -
FilePathResult
:返回文件内容 -
FilePathResult
:返回文件路径 -
FileStreamResult
:返回文件内容 -
EmptyResult
:什么都不返回 -
JavaScriptResult
:返回脚本执行 -
RedirectToResult
;重定向到指定的网址 -
HttpUnauthorizedResult
:返回403HTTP状态码 -
RedirectToRouteResult
:重定向到不同的动作/不同的控制器动作 -
ViewResult
:作为视图引擎的响应收到 -
PartialViewResult
:作为视图引擎的响应收到
ASP.NET MVC 过滤器
- 在ASP.NET MVC中,控制器定义的操作方法通常与可能的用户交互具有一对一的关系,但是有时候希望在调用操作方法之前或者在操作方法运行之后执行逻辑
- 所以ASP.NET MVC提供了过滤器,过滤器是一个自定义的类,过滤器提供了一种声明和程序式的方法,可以将操作前和操作后的行为添加到控制器操作方法中
ASP.NET MVC 动作过滤器
- 动作过滤器是一个属性,可以将动作过滤器应用于控制动作或整个控制器,以修改执行动作的方式,
- ASP.NET MVC 框架包括以下几个操作过滤器
-
OutputCache
- 将控制器操作的输出缓存指定的时间量 -
HandleError
- 处理执行控制器操作时引发的错误 -
Authorize
- 是能够限制对特定用户或角色的访问
ASP.NET MVC 过滤器的类型
ASP.NET MVC框架支持四种不同类型的过滤器
- 授权过滤器-实现
IAuthorizationFilter
属性 - 动作过滤器-实现
IActionFilter
属性 - 结果过滤器-实现
IResultFilter
属性 - 异常过滤器-实现
IExceptionFilter
属性 - 过滤器按照上面列出的顺序执行,例如,授权过滤器始终在动作过滤器和异常过滤器之前执行
- 授权过滤器用于实现控制器操作的身份验证和授权
自定义过滤器
- 要创建自己的自定义过滤器,ASP.NET MVC框架提供了名为
ActionFilterAttribute
的基类,此类实现了IActionFilter
和IResultFilter
接口,都是从Filter
类派生的
ASP.NET MVC 选择器
- 动作选择器时可以应用于动作方法的属性,用于影响响应请求时调用哪个动作方法
- 动作选择器有助于路由引起选择正确的操作方法去处理特定的请求
- 当编写动作方法时,动作选择器将依据动作方法前面给出的修改后的名称决定方法的调用行为
- 动作选择器通常用于别名操作方法的名称
ASP.NET MVC 选择器的三种类型的属性
-
ActionName
:表示一个用于动作名称的属性,允许开发人员使用与方法名称不同的动作名称(即动作的别名) -
NonAction
是另一个内置属性,表示Controller
的公共方法不是一个操作方法,当想要一个方法不要被当作一个操作方法去处理的时候,就可以使用NonAction
属性 -
ActionVerbs
属性,限制了特定行为对特定的HttpVerbs
的指示 - 可以定义两个具有相同名称的不同操作方法,但是一个操作方法会响应HTTP Get请求,另一个操作方法会响应
Http Post
请求 - MVC框架支持
HttpGet,HttpPost,HttpPut,HttpDelete,HttpOptions,HttpPatch
ASP.NET MVC 视图
- 在ASP.NET MVC 应用程序中,当在URL中指定路径是,可以想页面那样但不包含对应的任何内容直接显示给用户
- 在ASP.NET MVC中,最接近页面的东西就是视图
- 所有传入的浏览器请求都由控制器处理,并将这些请求映射到控制器操作,控制器可能会返回一个视图,或者也可能执行一些其他类型的操作,例如重定向到另一个控制器动作
ASP.NET MVC 数据模型
- ASP.NET MVC 数据模型用于在存储数据,并根据来自控制器中的命令检索出现数据,最终在视图中显示数据
-
Model
是一个类的集合,应用程序中可使用这些数据编写业务逻辑,基本上模型是业务域领域特定的容器,模型用于与数据库进行交互,也可以用来操纵数据区实现业务逻辑