我正在学习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 参考说它需要一个字符串、字符串、对象,所以我尝试做一个小的更改(在所有内容前面添加一个"my"只是为了修改名称并查看它是否有效(:
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}/产品/展会/饮料
{表}/详细信息.aspx/产品/详情.aspx
博客/{操作}/{条目}/博客/显示/123
{报告类型}/{年}/{月}/{日}/销售/2008/1/5
{区域设置}/{操作}/美国/显示
{语言}-{国家}/{行动}/en-US/show
{控制器}/{操作}/{id}http://server/application/Products/show/beverages
{resource}.axd/{*pathInfo}http://server/application/WebResource.axd?d=...
我用谷歌搜索了一下,但所有的帖子似乎都假设我知道格式,并且找不到任何详细的解释。它们是否必须是固定名称,如 {controller} {action} {id} 等,否则它们将不起作用?默认的匿名对象值名称也需要匹配它们吗?此外,{*pathInfo}中的"*"是什么意思,我找不到解释,neihter。谢谢。
首先,我们需要一些定义。
让我们分解默认路由。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
在本例中,第 2 行的 Default 只是用于标识路由的文本名称。
第 3 行是 url 模式。 这定义了路由的匹配方式。 大括号中的内容是占位符。 它们映射到参数名称。 因此 {控制器} 映射到控制器名称。 {action} 映射到操作名称,{id} 映射到名为 id 的参数。
第 4 行是默认对象。 当无法从 url 推断默认值时,此对象提供默认值。
因此,如果我们把所有这些放在一起,我们可以得出以下结论:
默认对象仅在无法从 URL 字符串推断值时提供值。 因此,当传入的请求刚/
时,来自第 4 行的 dfault 值用于控制器和操作。 如果传入请求/Blah
,则忽略第 4 行提供的默认控制器,而是 MVC 查找 BlahController
。 但是,由于未指定任何操作,因此将使用第 4 行中的默认操作Index
。
这里要记住的关键是,仅当与第 3 行中的 url 不匹配时,才会使用第 4 行的值。
所以,当你改变一切时,你把所有东西都扔了一遍。 这是一个毫无意义的路由,因为没有定义要使用的控制器或操作,并且需要这两个值才能完成路由。 因此,MVC 无法确定您想要什么控制器。 或为此的操作方法。
再比如:
routes.MapRoute(
"Example",
"Home/{action}/{myid}",
new { controller = "NotHome", action = "Index", myid = UrlParameter.Optional }
);
因为 url 中没有{controller}
占位符,所以使用默认值"NotHome",这使得 MVC 查找NotHomeController
。 因此,/Home/About/3
的 url 意味着控制器 = "NotHome",操作 = "关于",myid = 3。
总而言之,在传入路由中,某些内容必须至少填写控制器和操作的值。 id 是可选的,可以重命名为您想要的任何名称。 但是,某些东西必须设置控制器和操作参数,否则 MVC 不知道如何路由东西。
此外,请记住,默认路由(或有效的默认路由(必须在列表中排在最后,否则不会匹配其他路由。
{*pathInfo}
位称为 slug。 它基本上是一个通配符,表示"此点之后的所有内容都填充到名为 pathInfo 的参数中"。 因此,如果您有这样的"{resource}.axd/{*pathInfo}"
和 url:http://blah/foo.axd/foo/bar/baz/bing
则创建两个参数,一个称为 resource
,它将包含foo
,另一个称为pathInfo
包含foo/bar/baz/bing
。