接下来我们一起了解ASP.NET MVC的最重要的核心技术,了解ASP.NET MVC的开发框架,生命周期,技术细节。

一、Routing与ASP.NET MVC生命周期

1.Routing——网址路由

(一)  对比通过浏览器传来的http请求

了解网址路由(Routing)与运行生命周期的重要技术十分重要。

网址路由在ASP.NET MVC中有两个目的:

1.对比通过浏览器传来的http请求并对应到适当的Controller和Action进行处理。

2.决定ASP.NET MVC应该输出什么样的响应给浏览器。

如果HttpHandler是由  MvcHandler(MvcHandler Class:Selects the controller that will handle an HTTP request.)来处理,那么这时就会进入ASP.NET MVC的运行生命周期并会查找适当的Controller和Action进行处理,并适当的响应消息给客户端。

说的浅显一点,所谓的“网址路由在对比浏览器发送来的Http请求”时时这样运作的:

首先先将默认模板的ASP.NET MVC项目给运行起来,单击页面右上角关于链接,接下来会打开“关于”页面:

此时浏览器的网址列出现的URL路径会变成以下,我们要特别注意的部分在于“URL路径”这部分:http://localhost:63471/Home/About

这个单击链接的动作事实上会让浏览器将URL转换成一个Http请求的封包,并且由浏览器发出http请求到服务器上,这时会先由IIS接到这个http封包,然后再转交给网址路由模块负责决定要将此http请求交给哪个HttpHandler处理。

这个例子中是交给MvcHandler处理,接着才会进入ASP.NET MVC运行生命周期。

(二)响应适当的网址给浏览器

网址路由的另一个重要功能是决定ASP.NET MVC应该输出什么样的网址响应给浏览器,由上篇我们已经知道,所有网页的呈现都会将程序代码撰写在View页面中,这其中当然包括所有出现在View里的超链接。

@Html.ActionLink("关于","About","Home")

这段@Html.ActionLink函数将会输出一下Html超链接:

<a href="/Home/About">关于</a>

在ASP.NET MVC的View生成这段超链接与网址路由的规则定义息息相关。

(三)默认网址路由属性解说

上篇中提到,mvc4或者说mvc5默认的网址路由规则定义在App_Start\RouteConfig.cs文档中,以下将详细解说每一个部分的程序代码,参考下列标号的部分。

①:所有ASP.NET Web应用程序的入口点就在HttpApplication的Application_Start()事件,其中RouteTable.Routes是一个公开的静态对象,用来保存所有网址路由的规则集(RouteCollection),在ASP.NET MVC里会从Globel.asax的Application_Start()事件加上以下行,将RouteTable.Routes变量传入RouteConfig.RegisterRoutes静态方法:

RouteConfig.RegisterRoutes(RouteTable.Routes);

代码规则如下:

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}

②在默认RegisterRoutes方法中的IgnoreRoute,是用来定义不要通过网址路由处理的网址,该方法的第一个参数就是设置“不要通过网址路由处理的URL样式”。

这里所谓的“不要通过网址路由处理”,其代表的意思就是:如果今天从客户端浏览器传送过来的网址在这一条规则对比成功,那么就不会再通过网址路由继续对比下去,而这些被忽略的http要求,将会改由IIS的其他HTTP模块(HttpModules)进行处理,并且这些要求也不再与ASP.NET MVC相关,所以也不会进入ASP.NET MVC运行生命周期。

③再IgnoreRoute方法中第一个参数里的{resource}代表一个RouteValue路由变量,其路由变量的名称为resource,但在这里取任何名字都可以,因为这只是一个代表一个变量空间(PlaceHolder)而已,总之就是代表一个“位置”,可以放置一个用不到的变量。

而{resouce}.axd代表的意思就是:所有*.axd文档网址,在ASP.NET里有许多内建的HttpHandler(大多在ASP.NET Web Form里会用到),所有*.axd结尾的网址通常都代表着其中一个HttpHandler,例如我们在ASP.NET Web Form常用的WebResource.axd就是其中一个常见的HttpHandler。为了不让ASP.NET MVC把这些*.axd的HttpHandler也被视为是ASP.NET MVC来运行,所以必须加上这条IgnoreRoute规则,将其排除在ASP.NET MVC运行生命周期之外。

④在IgnoreRoute方法中第一个参数里的{*pathInfo}也是一个RouteValue路由变量,其名称为pathInfo,但名称前面的* 代表CatchAll(全部抓到)的意思,这个名为PathInfo的RouteValue会是完整的路径信息(PATH INFO)除标号③比对到的网址。

最后再重新看一遍这条URL样式:

{resource}.axd/{*pathInfo}

这条IgnoreRoute的网址路由规则所定义的URL样式所代表的的就是:只要网址出现任何.axd结尾的网址,而且在该网址后面出现任何路径都会被视为跳过网址路由的网址。

举个例子,若网址/WebResource.axd/a/b/c/d的话,{resource}.axd就会比对到WebResource.axd这个路由值,而{*pathInfo}得到的路由值将会是a/b/c/d,如果{*pathInfo}没加上星号的话(例如{pathInfo}),那么,该pathInfo路由值就会等于a。而在这里其实取任何名字都可以,因为这只是代表一个变量的位置而已。

⑤MapRoute是最常用来定义网址路由的扩充方法。

⑥name参数定义Route名称,在此为“Default”

⑦url具名参数定义URL样式与每个路径段落(PathSegment)的RouteValue参数名称,在这里,我们的URL样式如下:

{controller}/{action}/{id}

意思是说,我们这里定义的URL样式包含三个路由参数,分别命名为controller、action与id,如果输入的网址路径是/Home/About/123的话,那么controller的路由值就是Home,action的路由值是About,而id的路由值就是123。

⑧defaults具名参数定义各RouteValue路由参数的默认值,当网址路由比对不到HTTP要求的网址时,会先尝试带入这里定义的默认值,然后再进一步对比是否有符合的Controller与Action可以运行。

2.HTTP要求的URL如何对应网址路由

1)路由对应流程:

2)如何替网址路由加上路由值的条件约束

MapRoute是最常用来定义网址路由规则的扩充方法,它有许多使用的方式(多载),实际上我们也常用constraints这个具名参数替路由值加上一些条件约束,这些条件约束是以正则表达式为格式,通过正则表达式来验证路由值的属性是否符合该式样。

 public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
//约束路由条件
constraints: new { id=@"\d+" }
);
}
}

我们在MapRoute后加了constraints具名参数,该参数指定了一个匿名对象,其中有个id属性就是比对{id}路由值的限制条件,限制条件由正则表达式写成,"\d+"代表{id}必须全为数字才能算比对成功。

3.网址路由如何在ASP.NET MVC中生成网址

使用RouteTable.Roubles.GetVirtualPath静态方法取得ASP.NET里面动态生成的网址。

使用RouteTable.Roubles.GetVirtualPath取得路径是ASP.NET MVC核心在做的事,算艰深的用法,但在定义Route路由类别的时候还是有机会用到的。

用默认的ASP.NET MVC项目进行测试,打开http://localhost/Home/About网址

HomeController→About

二、Model相关技术

三、Controller相关技术

四、View数据呈现相关技术

五、Area(区域)相关技术

ASP.NET MVC学习笔记(二)笔记的更多相关文章

  1. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  2. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  3. ASP.NET MVC学习系列(二)-WebAPI请求(转)

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  4. ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  5. ASP.NET MVC学习(二)之控制器Controller

    1.控制器 Controller接收用户请求,将Model和View匹配在一起,共同完成用户请求.它是一个分发器,通过选择不同的Model.View,可以决定完成不同的用户请求. 但Controlle ...

  6. ASP.NET MVC学习---(二)EF文件结构

    之前已经简单的介绍过ORM框架和EF 也了解了EF的种种优点 那么这个EF到底长啥样子都还没见过呢 别着急 接下来,科学教育频道--走近科学 带你走进EF的内心世界~ 那么接下来就是~ 等等等等... ...

  7. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  8. ASP.NET MVC学习笔记-----Filter2

    ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...

  9. ASP.NET MVC学习笔记-----Filter

    ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...

  10. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

随机推荐

  1. github上值得关注的前端项目【转】

    今天突然看到了这些资源,所以就转载过来了,虽然是2015年的,但是可以看一下 综合/资源 frontend-dev-bookmarks 一个巨大的前端开发资源清单.star:15000 front-e ...

  2. 如何用原生JS实现一个简单的promise

    我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...

  3. 安卓开发_WebView设置打开网页缩放问题

    之前实现打开网页的方式,测试后,发现不能够对网页进行缩放操作,这对部分网页来说是十分不便的, 百度了一下解决方案 其实只需要加几行代码就可以实现网页缩放操作 settings.setUseWideVi ...

  4. 命令行选项 - Mozilla 产品与私有技术 | MDN - Google Chrome

    命令行选项 在本文章中 语法规则 使用命令行选项 示例 用户配置档 -CreateProfile profile_name -CreateProfile "profile_name prof ...

  5. mybatis学习--缓存(一级和二级缓存)

    声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...

  6. 用Python实现数据结构之树

    树 树是由根结点和若干颗子树构成的.树是由一个集合以及在该集合上定义的一种关系构成的.集合中的元素称为树的结点,所定义的关系称为父子关系.父子关系在树的结点之间建立了一个层次结构.在这种层次结构中有一 ...

  7. 解决wordpress上传文件出现http错误问题

    解决wordpress上传文件出现http错误问题 问题现象 今天上传约1.4m大小的gif文件到wordpress的媒体库时失败,提示http错误. 原因 由于之前一直上传图片都是可以的,所以推测最 ...

  8. UUChart的使用

    一.简介 UUChart是一个用于绘制图表的第三方,尤其适合去绘制折线图.自己再做一个医院相关的项目时,需要对一周内的血压进行监控,需要绘制折线图来表示出高压.低压的走向,因此学习了一下. 二.下载地 ...

  9. 关于HashMap自定义key重写hashCode和equals的问题

     使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals() hashcode()和equals()都继承于object,在Object类中的定义为: equals( ...

  10. 错误: 无法访问InstrumentationTestRunner 找不到android.test.InstrumentationTestRunner的类文件

    错误: 无法访问InstrumentationTestRunner找不到android.test.InstrumentationTestRunner的类文件