ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇:ASP.NET MVC全局观

2024-04-24 17:08

本文主要是介绍ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇:ASP.NET MVC全局观,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要
      本文对ASP.NET MVC的全局运行机理进行一个简要的介绍,以使得朋友们更好的理解后续文章。

前言
      在上一篇文章中,我们实现了第一个ASP.NET MVC页面。对于没有接触过这个框架的朋友来说,可能对有些地方会迷惑,所以这篇文章我将通过图示配合文字的方法,站在全局的角度介绍一些ASP.NET MVC的运行机制,这样可以帮助朋友们更好的理解后续文章。^_^

全局
      首先我们来看一副图片,由于这幅图是我自己画的,不是摘自微软官方,所以如果有什么不到位的地方还望海涵!


      首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerName/ActionName/Parameters的样子。这个请求被ASP.NET MVC的路由映射系统截获。(路由映射可以在Global.asax中配置,我们一会再说)路由映射系统按照映射规则,解析出控制器名ControllerName,Action名ActionName和各个参数Parameters,然后,找寻Controllers目录下的ControllerNameController.cs这个控制器类,默认情况下,系统总是找寻Controllers目录下的“控制器名+Controller”这么一个类,然后,找寻这个类下与ActionName同名的方法,找到后,将Parameters作为参数传给这个方法,而后Action方法开始执行,完成后返回相应视图,默认情况下,会返回Views目录下与ControllerName同名的目录下的与ActionName同名的aspx文件,并且将ViewData传递到视图。ViewData中一般包含了控制视图显示的控制量以及视图显示需要的数据。
      我们按以上思路回顾一下上一篇中主页的请求过程。我们传递的url是http://localhost/Home/Index。默认路由规则下,将ControllerName设为“Home”,ActionName设为“Index”,没有参数。于是系统找寻Controllers目录下的HomeController类的Index方法,成功找到,于是执行之。这个方法调用Mock的Model取出一些数据,放入ViewData相应键值项里。然后返回视图,返回的是Views下Home下的Index.aspx。这个视图取出ViewData中的数据按照一定格式呈现,于是完成了一次典型的ASP.NET MVC调用。

路由
      从上面可以看出,ASP.NET MVC中路由是很重要的。它直接决定了如何解析url,因此决定了系统如何工作。那么,下面我们来揭开路由神秘的面纱。
      打开我们Demo下的Global.asax.cs文件,可以看到如下代码:
Global.asax.cs:

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Web;
 5 using  System.Web.Mvc;
 6 using  System.Web.Routing;
 7
 8 namespace  MVCDemo
 9 {
10    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
11    // visit http://go.microsoft.com/?LinkId=9394801
12
13    public class MvcApplication : System.Web.HttpApplication
14    {
15        public static void RegisterRoutes(RouteCollection routes)
16        {
17            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
18
19            routes.MapRoute(
20                "Default",                                              // Route name
21                "{controller}/{action}/{id}",                           // URL with parameters
22                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
23            );
24
25        }

26
27        protected void Application_Start()
28        {
29            RegisterRoutes(RouteTable.Routes);
30        }

31    }

32}
复制代码


      我们拣重点说。注意上面有个routes.MapRoute方法。这个方法的作用是向系统增加一条路由规则。这里唯一的一条规则是系统默认增加的,第一个参数是规则名,是一个普通字符串。关键是第二个参数,它也是一个字符串,但是它描述了如何解析url。可以这样理解,它描述了url串HostName后面部分如何匹配,其中带{}的表示参数匹配,如果不带则表示字符串匹配。
      例如,上面的{controller}/{action}/{id}表示如果HostName后面有三段由“/”分割的字符串,则这个url被匹配,并且分别被解析成控制器名,Action名和一个叫“id”的参数。如果你输入的是http://localhost/Home/Index/1则后面的“1”将被当做参数id的值,但是如果你请求http://localhost/Home/Index/1/2,抱歉,你的请求无法成功,因为这条路由规则没法匹配你的url,因为你的HostName后面有四段,而这个路由规则只能匹配三段的。
      也许你还注意到一个问题,http://localhost/Home/Index明明HostName后面只有两段,怎么也被匹配了呢?这就是MapRoute方法的第三个参数起作用了。这个参数的作用是为上面规则中各个{}匹配段设置默认值,如上,id的默认值为"",即空。所以在http://localhost/Home/Index中,虽然没有显示指定id,但是它依然可以匹配成功,默认作为空值。如果你把其中id=""去掉,你会发现http://localhost/Home/Index已经无法匹配了。依次类推,http://localhost/Home/也可以匹配成功,因为{action}默认是Index,http://localhost/也可以匹配成功,因为默认{controller}为Home,所以,在这条默认值下http://localhost/Home/Index和http://localhost/是等效的。
      综上分析,我们得出一条重要结论:在默认值被设置的情况下,映射规则“配少不配多”,少的部分由默认值代替。

      上面的匹配规则中,三个匹配段都带大括号的,都是参数匹配,下面我们来说说强字符串匹配。例如,我们有一个url需要这样http://localhost/Category/Detail/Name。如果按照上面的匹配规则,Name段的值会被匹配到id中去,可是我们想在CategoryController的Detail方法中使用名叫“name”的参数而不是使用名叫“id”的参数,怎么办呢?很简单,我们增加一下一条匹配规则:

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Web;
 5 using  System.Web.Mvc;
 6 using  System.Web.Routing;
 7
 8 namespace  MVCDemo
 9 {
10    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
11    // visit http://go.microsoft.com/?LinkId=9394801
12
13    public class MvcApplication : System.Web.HttpApplication
14    {
15        public static void RegisterRoutes(RouteCollection routes)
16        {
17            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
18
19            routes.MapRoute(
20                "Category",                                              // Route name
21                "Category/Detail/{name}",                           // URL with parameters
22                new { controller = "Category", action = "Detail", name = "" }  // Parameter defaults
23            );
24
25
26            routes.MapRoute(
27                "Default",                                              // Route name
28                "{controller}/{action}/{id}",                           // URL with parameters
29                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
30            );
31
32        }

33
34        protected void Application_Start()
35        {
36            RegisterRoutes(RouteTable.Routes);
37        }

38    }

39}
复制代码


      可以看到,我们在默认规则前增加了一条规则,其中其中控制器名和Action名不再是参数,而变成了强字符串(没有{})。这时,当我们请求的url是http://localhost/Cateogry/Detail/para的形式时,就会直接匹配新加的规则,而para的值不会被赋给成id而是赋给名叫name的变量。
      需要注意的是,我们新的路由规则一定要放在前面,因为ASP.NET MVC会自上向下匹配第一条找到的可匹配路由规则。

视图
      说完了路由规则,我们再来说说视图。
      上面说道,Action方法返回类型是ActionResult,其实这个返回类型不局限于View方法返回ViewResult,它还有很多实现,这里列举几个。
      ViewResult:一般呈现某个aspx文件,由View方法返回。
      RedirectToResult:使浏览器重定向,由Redirect方法返回。
      RedirectToRouteResult:直接交给下一个Action,由RedirectToAction方法返回。
      还有几个,先不说了,因为后续文章基本用不到其他的,关于那几个以后朋友们可以自己看相关资料。

小结
      看完这篇文章,就基本把90%的障碍扫清了。下面的文章中,将继续我们的实例。在下一篇中,我们来完成发布公告的功能,看看ASP.NET MVC下如何处理表单信息的传递。


转载地址:http://www.cnblogs.com/leoo2sk/archive/2008/11/01/1324168.html

这篇关于ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇:ASP.NET MVC全局观的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932332

相关文章

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm