有人可以向我解释asp.net路由语法吗?

时间:2010-07-01 08:41:31

标签: asp.net syntax routing

我正在Web窗体场景中处理此代码:

  public static void RegisterRoutes(RouteCollection routes)
  {

    Route r = new Route("{*url}", new MyRouteHandler());
    routes.Add(r);
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.gif/{*pathInfo}");

  }

首先,谁能告诉我{* pathInfo}的定义在哪里? http://msdn.microsoft.com/en-us/library/cc668201.aspx#url_patterns并没有真正定义它。作用:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

匹配

/c/xyz.axd and 
/b/c/xyz.axd and
/a/b/c/xyz.axd 

尽管

routes.IgnoreRoute("{resource}.axd");

仅匹配

/xyz.axd

其次,在:

{*url}

*是什么意思?整个表达是什么意思。有没有明确解释的地方?

第三,是否需要添加这些表达式才能正确忽略路由?我知道{* url}是某种捕获,如果IgnoreRoutes在它之前或之后出现,例如

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.gif/{*pathInfo}");
Route r = new Route("{*url}", new MyRouteHandler());
routes.Add(r);

2 个答案:

答案 0 :(得分:24)

我的2美分: 路线不是正则表达式。它只是构成路径的变量和静态组件,由段(由斜杠标识)分隔。有一个特殊符号,即最后一个变量中的星号,这意味着从这里开始,忽略segment-separator - 斜杠。所以,

{*url} 

是最简单的路由,因为它意味着获取整个URL,将其放入变量'url',并将其传递给与该路由关联的页面。

{controller}/{action}/{id}

将所有内容放在第一个段 - 第一个斜杠 - 放入变量'controller',将第一个和第二个/之间的所有内容放入变量'action',以及第二个和第三个斜杠之间的所有内容(或结束)变量'id'。然后将这些变量传递到关联页面。

{resource}.axd/{*pathInfo}

这里,将.axd /(并且它不能有任何斜杠!)之前的信息放入'resource',并将第一个/之后的所有内容放入'pathInfo'。由于这通常是ignoreRoute,因此它不是将其传递给相关的页面,而是由Stop​​Handler处理,这意味着路由不会处理它,而是由非路由HttpHandler处理。

正如bleevo所说,路线是按照它们被添加到集合中的顺序执行的。所以必须在处理通用路由之前添加IgnoreRoute。

这是马的嘴:http://msdn.microsoft.com/en-us/library/cc668201.aspx

具体到你的例子,我会将IgnoreRoute线放在Route添加的上方,因为你的路线实际上是一个全能的。另外,请记住,只有当gif位于根目录中时才会遵守.gif忽略。

答案 1 :(得分:2)

pathinfo只是一个桶的标签。因此,例如{*pathinfo}表示将{resource}.axd/之后的所有内容放入pathinfo。

路由按照您将它们放在路由表中的顺序执行,因此如果您的第一个路由是捕获,则其余路径将永远不会执行。