您将会发现——页面神奇地跳转到到了AddItem页。但是按照原来的路径映射您应该认为说“FinanceManager下根本没有任何页面只是一个Controller而已”或许你还会按照原思路作出这样的想法http://localhost:端口号/Views/AddItem.aspx但是遗憾的是这种想法也是错误的。哦MyGod……其实这种URL路径已经和真实的文件映射已经没有很大的关系了。你仔细看过我的前面一篇文章对于该项目的介绍之后再了解结构之后你应该清楚地知道所有的视图页面都在Views文件夹中而Controllers中只有一个控制器文件。并且你有心的话会发觉你那个实验的URL中的FinanceManager恰好是该Controller中的文件名而AddItem恰恰又是该Controllers中的一个函数名称打开Views下文件夹你细细观察其中就有一个文件夹叫做FinanceManager而且还包含着一个被成为“AddItem”的页面……啊MVC那么神奇竟然可以通过地址映射“自动寻找”对应的逻辑控制代码而且返回Views中的某个页面是的您的猜想是对的。一般而言一个MVC的URL的标准格式如下根目录http://域名:[端口号]/控制器名/逻辑函数名v 其中“控制器名”是位于Controllers文件夹下的一个文件“排除后缀”的名称这就意味着您必须命名规范Controller文件必须是“XXXXController”而且是区分大小写的不信您可以试试 http://localhost:端口号/FinanceManager/addItem。当输入这样一个URL以后程序自动会搜索全部本工程根目录下以及所有子目录中带有Controller后缀名的文件去除Controller并与“控制器名”进行完全匹配直到找到没有找到将报错说页面找不到。实际上既然MVC会自动搜索您当然大可不必死板地将Controller文件放到一个地方比如示例程序的Controllers文件夹但是便于管理微软包括我也是推荐您这样做的。v 在找到这样一个与之匹配的Controller之后接下来读取“逻辑函数名”逻辑函数实质就是这个Controller函数中的某个公共函数因为也是同名匹配所以您不能进行重载设想如果重载系统到底取哪个函数呢糊涂了而且不允许使用泛型类型比如您不能定义诸如public ActionResult XXXT(T param){……}之类的函数理由很简单——因为一旦定义了未知类型您在使用这个函数的头一件事情必须要告诉该函数的类型但是Controller是自动解析的你根本没有办法告诉它什么类型至于说为什么可以使用“系统基本类型?”的形式比如int?本质也是泛型等同于Nullableint…是因为int?只有两种类型——要么int要么null这两种都可以被识别的而且最关键的在于Nullableint已经自行定义给出了。当然还有其它的一些限制因为考虑读者最容易犯忌的往往是这两个所以特别着重提出。至于其它的可以在网络上自行搜索自己动脑好好思考为什么。由此可见微软内部默认的机制已经规定了MVC中URL的映射处理的方式从冒号后开始解析遇到第一个“/”前的一串字符串就是映射Controller后缀的文件名待找到以后深入找里边的某个方法名从第一个“/”到第二个“/”之间的一串字符串。这样看来“约定胜于配置”是微软MVC项目的关键之处。二、自定义我的URL——我的地盘我做主或许你对这种默认的规则还怀有好奇心想找找微软究竟定义在何处了来打开你的Global.aspx文件看看里边是不是有这样一个静态方法的定义public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute({resource}.axd/{*pathInfo});routes.MapRoute(Default”,{controller}/{action},new { controller FinaceManager, action Index });}你发现模板自行定义了一个{controller}/{action}的格式。一般说来MVC2中Controller和Action必须定义也就是说无论如何系统总得要找到Controller和Action只不过你可以指定默认值就像上面给出的例子一样。因为给出了controller和action的默认值因此你直接就可以http://localhost:[端口号]而不必指出具体的Controller和Action了。实际上URL完全可以被自定义比如你可以这样指定一个URLroutes.MapRoute(Default”,FinanceManager/{action},new { controller FinaceManager, action Index });}你仔细观察我的这个示例代码你将发现那个{controller}已经不复存在了。但“不复存在”不代表没有因为很明显在new{…}已经定义。注意“FinanceManager”是一个常数字符串这意味着您在URL输入的时候必须是http://localhost/:[端口号]/FinanceManager/才可以不能说此处的FinanceManager就是Controller名。您完全可以使用{controller}和{action}指定URL的格式化这就意味着您可以自定义格式让系统知道什么地方是controller什么地方是action以便让系统自行解析。当然在缺省{controller}或者{action}的任何一个或者全部的定义情况下请务必指定默认值。总而言之判断的标准是按照您所指定的URL系统应该能够解析得到controller和action否则必须指定默认值。当然除了可以定义常量(如上面的FinanceManager常量字符串前缀变量也可以定义到URL中去看这个例子routes.MapRoute(Default”,{controller}/{action}/{id},new { controller FinaceManager, action Index,id”” });}这是微软标准的一个URL的定义默认的您下载我的代码看