1、使用MVC模式有什么优点?
答:可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
2、请简述使用ASP.NET MVC框架访问一个页面的执行流程。
答:一共分为以下几个步骤:
第一步:当请求到达我们的服务器时,在asp.net取得控制之前,windows
操作系统的核心组件 HTTP.SYS
一直在监听请求端口, 接下来asp.net会通知所有注册的httpModule
。 有一个httpModule
是默认注册了的。那就是UrlRoutingModule
,也就进入了路由模块.核心路由接管控制。
第二步:当核心路由系统接管控制之后,会把请求封装成 RequestContext
这样一个数据结构。这个数据结构中包含了几乎所有的请求信息,以便后面的组件可以任意的去使用它。mvc框架就是使用requestContext
中的信息,将控制权转移给对应的controller
对象,并提出其中的action
参数。
第三步:mvcRouteHandler
从核心路由模块过渡到mvc框架之后,就要生产对应的controller
对象类处理了。
这些对象你可以采用不标准的方法通过直接实现Icontroller
接口来创建 ,也可以通过controllerFactory
来实现。当然这个控制器工厂可以是你自定义的实现了IcontrollerFactory
接口的自定义工厂(或者是默认工厂的子类),也可以是mvc框架自带的DefaultControllerFactory
来创建。
第四步:controllers
内部的这些action
并不是直接自己invoke
的 而是通过一个IActionInvoker
来触发执行,然后返回actionResult
给ViewEngine
去解析。同理,这个IActionInvoker
我们也可以自行实现。
3、请说明MVC Filter
的特点、思想;框架提供的Filter
有哪些?如何扩展Filter
?
答:Filter
思想:AOP面向切面编程的思想,指的是:在不破坏原有的代码的情况下,可以动态的扩展功能。
.NetFramework 框架下的MVC一共有系统默认的三个Filter
:
Authorize
–权限Filter
,专门用来控制权限。
ActionFilter
:方法执行前/后,视图替换前后,扩展功能。
ExceptionFilter
:异常处理Filter.
扩展Authorize
:自定义Filter
,继承自Authorize
,覆写父类虚方法;标记在需要验证权限的方法、控制器即可,也可全局注册;
扩展ActionFilter
:无法直接使用,自定义Filter
,继承自ActionFilter
,覆写父类虚方法,标记在需要扩展功能的方法、控制器即可。
扩展ExceptionFilter
:自定义ExceptionFilter
,继承自ExceptionFilter
,实现虚方法即可!标记在需要捕捉异常的方法、控制器即可,也可全局注册;
4、请说明MVC中Filter
的几种注册方式。
答:三种注册方式:方法注册,控制器注册、全局注册;
5、请详解MVC路由的特点!
答:
- 能够根据系统需求,灵活的划分请求规则(不同模块请求的 URL 是不一样的)。
- 屏蔽物理路径,提高系统的安全性,以上情况是无法根据 URL 分析视图文件在站点目录中的位置。
- 有利于搜索引擎优化,可以将 URL 请求统一规范,以后维护中,如果页面发生变化,URL 可以保持不变。
- 可分为URL 模式的定义:
url: “{占位符1}字面量{占位符2}字面量{占位符n}”
,占位符:可以是一个字符串或字符,比如“x”、“id”、“year”等。字面量:可能是一个比较固定的字符,比较常见的是斜杠“/”;也可以是字符串。特殊规则:不能以斜杠“/”或波浪线“~”字符开头,不能包含“?”,同时占位符也不能连续。 - 可以定义多个路由,路由匹配的时候,只能匹配一个。注意路由名称不能重复;如果项目存在分区,需要添加
string[] namespaces
命名空间。string[] namespaces
这个命名空间 在分区的时候用到。
6、请说明MVC中global.asax.cs
文件的意义?
答:global.asax
这个文件包含全局应用程序事件的事件处理程序。它响应应用程序级别和会话级别事件的代码。
运行时, Global.asax
将被编译成一个动态生成的 .NET Framework
类,该类是从HttpApplication
基类派生的。
因此在global.asax
中的代码可以访问HttpApplication
类中所有的public
或者protected
的成员global.asax
不被用户直接请求,但global.asax
中的代码会被自动执行来响应特定的应用程序事件。
global.asax
是可选的,而且在一个web项目中是唯一的,它应该处于网站的根目录。
7、请说明在MVC视图中如果不使用using
关键字,如何应用某个自定义实体类型!
答:可以通过Views
文件夹下的WebConfig
文件配置:在该文件下的system.web.webPages.razor
节点下的namespaces
节点添加引用即可。(如果无法识别,请尝试重启VS)
8、请说明MVC中Area
的作用以及在MVC中如果使用了Area
以后我们需要注意什么?
答:Area:区域,从MVC 2开始,引进了区域的概念,它允许将模型,视图和控制器分成单独的功能节点,换句话说,可以在大型复杂的网站中建立几个区域(模块),每一个区域都有Model,View,Controller
机制.
Area
可以完全独立出一个项目。
在使用Area
的过程中,注意路由的问题,需要在每个路由中指定命名空间。
9、请说明如何抓取并处理,异常Filter
抓取不到的异常?
答:可以在全局文件Global.asax
中,编写Application_Error(object sender, EventArgs e)
方法,可以抓取到所有异常,并做处理。
案例如下:
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError(); //获取到没有处理的异常
HttpContext.Current.Response.Write($"Error:{error.Message}"); //这就是异常消息的输出
Server.ClearError(); //清除这个异常
}
案例如下:
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError(); //获取到没有处理的异常
HttpContext.Current.Response.Write($"Error:{error.Message}"); //这就是异常消息的输出
Server.ClearError(); //清除这个异常
}