MVC3路由基础知识

时间:2012-04-27 05:02:22

标签: asp.net-mvc-3 routing format

我正在学习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。谢谢。

1 个答案:

答案 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