最近在学习MVC框架时,发现新建MVC的项目,会自动创建一个Global.asax文件,它跟我们平时所看到的文件的文件后缀名不一样,而且在这个文件中也有好多方法。现在介绍一下其中的两个方法,RegisterGlobalFilters()和RegisterRoutes()方法。
什么是Global.asax文件
Global.asax文件是ASP.NET应用程序文件,提供了一中在一个中心位置响应应用程序级别和模块级别时间的方法,它位于应用程序根目录下,每个应用程序根目录下只能有一个该文件。虽然创建时都会自动显示在应用程序中,但是这个文件是可选的,即使没有它,程序照样可以运行。
Global.asax 文件被配置为任何(通过 URL 的)直接 HTTP 请求都被自动拒绝,所以用户不能下载或查看其内容。ASP.NET 页面框架能够自动识别出对Global.asax 文件所做的任何更改。在 Global.asax 被更改后ASP.NET 页面框架会重新启动应用程序,包括关闭所有的浏览器会话,去除所有状态信息,并重新启动应用程序域。
Global.asax 文件继承自HttpApplication 类,它维护一个HttpApplication 对象池,并在需要时将对象池中的对象分配给应用程序。
RegisterGlobalFilters()
RegisterGlobalFilters()方法是FilterConfig接口下的方法,由方法名可以看出,注册全局过滤器,也就是说该方法用于注册全局过滤器。例如:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}</span>
HandleErrorAttribute类是用来做异常处理的,代码的含义就是注册该过滤器,实现MVC中的错误捕捉。
用户也可以创建自定义过滤器,然后把自定义过滤器添加到全局过滤器中,例如:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class CustomerFilterAttribute : ActionFilterAttribute
{
//自己所需要的Action
}</span>
添加到全局过滤器的方法是一样的,也就是:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomerFilterAttribute());
}</span>
RegisterRoutes()
RegisterRoutes()是RoteConfig类里面的方法,同样看方法名,其实就是注册路由。举个很简单的例子:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
}</span>
这段代码的意思就是视图的起始页是Home文件夹下的Index视图。
所谓的路由是URL到控制器类的某个方法的映射,其中Action要求必须是Public。MapRoute共有三个参数,第一个参数是定义路由名称,第二个参数定义了什么样的URL格式才能被解析,其格式为控制器类名/方法名/可选的参数,对应的就是{controller}/{action}/{id},其命名时,一般采用控制器名称Controller前面的部分,而不是完整的控制器名。第三个参数是定义的默认值,也就是默认访问的那个控制器以及其Action方法。
总结
不学不知道,以前总是听说MVC,真正学起来的时候发现里面有很多东西需要去学习。虽然理解起来不是很难,但是用起来还有一定难度,还是需要多实践。初学MVC,如果博客当中有什么不足,还请大神们指正,谢谢!