MVC3 路由基础知识



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

最新更新