对于下面这个方法,我想问下第三个参数,设置默认值的
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 是可以的。。
MVC框架是如何找到对应controller的对应action的:
(1)你在global.asax里定义了一个路由表,你可以想想成一个表格
(2)一个请求过来了,那么框架会去查找你定义的那个路由表格,找到第一个匹配的(这就是为什么默认的那个路由总是放在最下面,因为它是“不得已”的情况下才使用的
(3)找到定义的路由了,那么controller和action的名字也确定了,就可以通过controller factory去创建一个controller的实例了。
(4)有了controller实例,自然很容易找到对应名字的方法,也就是action的方法。(3)和(4)中很多地方都是反射实现的。
大概就是这个流程。有些细节是可以自定义的。
谢谢你的解答啊,不过你说的好像有点不对。
routes.MapRoute(
"Default", // 路由名称
"{a}/{b}/{c}", // 带有参数的 URL
new { a = "Home", b = "Index", c = UrlParameter.Optional } // 参数默认值
);
这样写的话,就直接报异常:
RouteData 必须包含名为“controller”且值为非空字符串的项
用得是VS2010 自带的MVC模板
@郁闷的冰: 好像是不行。。我没试过,想当然了……必须指定谁是controller,谁是action,否则程序怎么知道a是controller还是b是controller呢
@水牛刀刀: 实际上这样写
routes.MapRoute(
"Default", // 路由名称
"{a}/{b}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
就是不能达到和原始写法一样的效果。。。郁闷。。
直接 http://localhost:60969/ 这个地址的时候,不能找到默认页
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
这个写法就可以找到默认页面
谢谢 水牛刀刀 的热心帮助,已经了解清楚,
无论是占位符{controller}{action}
还是默认参数 new {controller="Home",action="Index"}
这两个地方都必须是这么写的。