首页 新闻 会员 周边 捐助

ASP.NET MVC的URL Route的一个小问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-01-17 10:21

对于下面这个方法,我想问下第三个参数,设置默认值的
 new { controller = "Home", action = "Index", id = UrlParameter.Optional }
这个地方,能a= "Home", b= "Index"这个样子吗?
就是说这个controller action这两个单词是固定的吗?
后面那个id这个单词不应该是固定的吧。

routes.MapRoute(
  "Default", // 路由名称
  "{controller}/{action}/{id}", // 带有参数的 URL
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
  );


想知道具体routes.MapRoute 怎么根据 controller = "Home", action = "Index" 找到具体的HomeController类的 Index方法的。
望赐教。


用自带的MVC项目模板,无论修改"{controller}/{action}/{id}" 

还是修改new { controller = "Home", action = "Index", id = UrlParameter.Optional }

最后启动项目后都不能识别默认页面了。

不知道为什么自带的默认URL路由,必须完完全全这么写,

我觉得写成"{a}/{b}/{c}" ,new { controller = "Home", action = "Index"}

完全可行啊,但是实际上就是不行。。。启动时找不到默认页。

输入Home/Index 是可以的。。

郁闷的冰的主页 郁闷的冰 | 初学一级 | 园豆:105
提问于:2012-01-13 18:00
< >
分享
最佳答案
0

MVC框架是如何找到对应controller的对应action的:

(1)你在global.asax里定义了一个路由表,你可以想想成一个表格

(2)一个请求过来了,那么框架会去查找你定义的那个路由表格,找到第一个匹配的(这就是为什么默认的那个路由总是放在最下面,因为它是“不得已”的情况下才使用的

(3)找到定义的路由了,那么controller和action的名字也确定了,就可以通过controller factory去创建一个controller的实例了。

(4)有了controller实例,自然很容易找到对应名字的方法,也就是action的方法。(3)和(4)中很多地方都是反射实现的。

大概就是这个流程。有些细节是可以自定义的。

收获园豆:10
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-01-13 18:02

谢谢你的解答啊,不过你说的好像有点不对。

routes.MapRoute(
"Default", // 路由名称
"{a}/{b}/{c}", // 带有参数的 URL
new { a = "Home", b = "Index", c = UrlParameter.Optional } // 参数默认值
);

这样写的话,就直接报异常:

RouteData 必须包含名为“controller”且值为非空字符串的项

用得是VS2010 自带的MVC模板

郁闷的冰 | 园豆:105 (初学一级) | 2012-01-13 20:14

@郁闷的冰: 好像是不行。。我没试过,想当然了……必须指定谁是controller,谁是action,否则程序怎么知道a是controller还是b是controller呢

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-01-13 20:30

@水牛刀刀: 实际上这样写

routes.MapRoute(
"Default", // 路由名称
"{a}/{b}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);

 

就是不能达到和原始写法一样的效果。。。郁闷。。

直接 http://localhost:60969/ 这个地址的时候,不能找到默认页

郁闷的冰 | 园豆:105 (初学一级) | 2012-01-13 23:56

routes.MapRoute(
 "Default", // 路由名称
 "{controller}/{action}/{id}", // 带有参数的 URL
 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);

 

这个写法就可以找到默认页面

郁闷的冰 | 园豆:105 (初学一级) | 2012-01-13 23:57
其他回答(1)
0

谢谢 水牛刀刀 的热心帮助,已经了解清楚,

无论是占位符{controller}{action}

还是默认参数 new {controller="Home",action="Index"}

这两个地方都必须是这么写的。

郁闷的冰 | 园豆:105 (初学一级) | 2012-01-17 10:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册