仅供学弟学妹们参考学习:
1. 一个URL请求到来时,首先由 Routing 来处理,分离出要访问的 controller、action 即一些附加参数。
然后 Controller Factory 负责实例化对应的 Controller 类,之后由 Action Invoker invoke对应的action方法,
这时通常从数据库中取一些数据或通过 POST 将数据存入数据库或执行一些计算操作, ViewEngine 会根据当前的请求,
找到相应的View,并把生成输出流返回到客户端。
2. ASP.ENT MVC3中所有的 View(.cshtml文件)最终都会被编译成类。当用户第一次请求网站中的一个页面时,
MVC Framework 会把所有的 .cshtml 编译成 class 文件,所有第一次请求一个页面比较慢,因为 views 会被编译,
以后再请求速度就很快了。
在 win7 中生成的 class 文件,默认会保存在像这样的路径下:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\d337a554\6efe171c
文件名类似这样以 App_Web 开头如:App_Web_42as5ct2.0.cs 。
打开一个class文件看一下:
public class _Page_Views_Home_Index_cshtml : System.Web.Mvc.WebViewPage<string[]> {
public _Page_Views_Home_Index_cshtml() {
}
public override void Execute() {
WriteLiteral("\r\n");
ViewBag.Title = "Index";
WriteLiteral("\r\nThis is a list of fruit names:\r\n\r\n");
foreach (string name in Model) {
WriteLiteral(" <span><b>");
Write(name);
WriteLiteral("</b></span>\r\n");
}
}
}
可以看到所有的类都继承自 System.Web.Mvc.WebViewPage<T> 其中 T 是传入的 Model 的类型,当没有
传入 Model对象时,会生成动态类型 System.Web.Mvc.WebViewPage<dynamic>,dynamic (其实在底层就是 object)
使你可以传进来任意的Model类型,但动态类型在运行时才被解析,可能导致运行时错误。当然在View中也不会有智能提示,所以
一般还是会使用 强类型的Model。View中的 C# code直接放入类中,而HTML tag 会用 WriteLiteral (封装了Response.Write)包裹起来。
ViewEngine 实际上寻找的是这些编译的 class 类,这与 java 中的 JSP 被编译成 servlet 很相似。
有些人可能做 ASP.NET MVC3 开发很长时间还不知道 Controller 是怎样被实例化的,Model 是怎样 Bind 的,action 是怎样被
invoke的,view 是怎样被找到和 ActionResult 怎样生成和返回到客户端的,view 会被编译成 class 等。虽然不知道这些东西对开发
影响不是很大,但显然对底层和 ASP.NET MVC3 源码有所了解,在开发中更能游刃有余。
MVC Framework的每个 component 几乎都可以被修改和完全重写,请求处理过程中的每个过程几乎都可以定制。
推荐阅读: Pro ASP.NET MVC3 Framework 3rd Edtion。
Pro ASP.NET MVC3 Framework 3rd Edtion下载地址:http://d.99pan.com/BDD59EA00900
ASP.NET MVC3源码下载地址:http://d.99pan.com/FB2D59EA8EB400