我正在学习MVC路由。希望我的问题看起来不傻,请帮忙:)
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
msdn引用说它需要一个字符串,字符串,对象,所以我尝试做一个小改动(在所有内容之前添加一个“我的”只是为了修改名称并查看它是否有效):
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{myresource}.axd/{*mypathInfo}");
routes.MapRoute(
"myDefault", // Route name
"{mycontroller}/{myaction}/{myid}", // URL with parameters
new { mycontroller = "Home", myaction = "Index", myid = UrlParameter.Optional } // Parameter defaults
);
它不再起作用了。 “{}”花括号中的这些字符串的格式是什么,以及匿名对象值格式。
{控制器} / {行动} / {ID} /产品/展示/饮料
{表} /Details.aspx /Products/Details.aspx
博客/ {动作} / {条目} /博客/显示/ 123
{REPORTTYPE} / {年} / {月} / {天} /销售/ 2008/1/5
{区域设置} / {动作} / US /显示
{语言} - {国家} / {动作} / EN-US /显示
{控制器} / {行动} / {ID} http://server/application/Products/show/beverages
{资源}个.axd / {*} PATHINFO http://server/application/WebResource.axd?d= ...
我google了,但所有帖子似乎都假设我知道格式,并且找不到任何详细解释。他们必须是固定名称,如{controller} {action} {id}等,或者他们不会工作?默认的匿名对象值名称是否也需要匹配它们?此外,{* pathInfo}中的“*”是什么意思我找不到对此的解释,neihter。谢谢。
答案 0 :(得分:7)
首先,我们需要一些定义。
让我们分解默认路线。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
在这种情况下,第2行的默认值只是用于标识路径的文本名称。
第3行是url模式。这定义了路由的匹配方式。大括号中的东西是占位符。它们映射到参数名称。所以{controller}映射到控制器名称。 {action}映射到操作名称,{id}映射到名为id的参数。
第4行是默认对象。如果无法从网址推断出此对象,则会提供默认值。
所以,如果我们把所有这些结合在一起,我们可以得出一些结论:
默认对象仅在无法从url字符串推断时提供值。因此,当传入请求仅为/
时,第4行的dfault值将用于控制器和操作。如果传入请求为/Blah
,则忽略第4行提供的默认控制器,而MVC将查找BlahController
。但是,由于未指定任何操作,因此使用第4行的默认操作Index
。
这里要记住的关键是第4行的值仅在没有与第3行中的url匹配时使用。
所以,当你改变一切时,你把所有东西都扔了一圈。这是一条毫无意义的路线,因为没有定义要使用的控制器或动作,并且为了完成路线,这两个值是必需的。因此,MVC无法确定您想要的控制器。或者就此而言的行动方法。
另一个例子:
routes.MapRoute(
"Example",
"Home/{action}/{myid}",
new { controller = "NotHome", action = "Index", myid = UrlParameter.Optional }
);
因为url中没有{controller}
占位符,所以使用默认的“NotHome”,这使得MVC查找NotHomeController
。所以/Home/About/3
的网址意味着控制器=“NotHome”,action =“关于”,myid = 3.
总而言之,在传入路径中,某事必须至少填写控制器和操作的值。 id是可选的,可以重命名为您喜欢的任何内容。但是,某些东西必须设置控制器和动作参数,否则MVC不知道如何路由事物。
另外,请记住,默认路由(或有效的默认路由)必须在列表中排在最后,否则不会匹配其他路由。
{*pathInfo}
位称为slug。它基本上是一个通配符,说“此后的所有内容都填充到一个名为pathInfo的参数中”。因此,如果你有"{resource}.axd/{*pathInfo}"
和这样的网址:http://blah/foo.axd/foo/bar/baz/bing
则会创建两个参数,一个名为resource
,其中包含foo
,另一个名为pathInfo
其中包含foo/bar/baz/bing
。