我正在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);
答案 0 :(得分:24)
我的2美分: 路线不是正则表达式。它只是构成路径的变量和静态组件,由段(由斜杠标识)分隔。有一个特殊符号,即最后一个变量中的星号,这意味着从这里开始,忽略segment-separator - 斜杠。所以,
{*url}
是最简单的路由,因为它意味着获取整个URL,将其放入变量'url',并将其传递给与该路由关联的页面。
{controller}/{action}/{id}
将所有内容放在第一个段 - 第一个斜杠 - 放入变量'controller',将第一个和第二个/之间的所有内容放入变量'action',以及第二个和第三个斜杠之间的所有内容(或结束)变量'id'。然后将这些变量传递到关联页面。
{resource}.axd/{*pathInfo}
这里,将.axd /(并且它不能有任何斜杠!)之前的信息放入'resource',并将第一个/之后的所有内容放入'pathInfo'。由于这通常是ignoreRoute,因此它不是将其传递给相关的页面,而是由StopHandler处理,这意味着路由不会处理它,而是由非路由HttpHandler处理。
正如bleevo所说,路线是按照它们被添加到集合中的顺序执行的。所以必须在处理通用路由之前添加IgnoreRoute。
这是马的嘴:http://msdn.microsoft.com/en-us/library/cc668201.aspx
具体到你的例子,我会将IgnoreRoute线放在Route添加的上方,因为你的路线实际上是一个全能的。另外,请记住,只有当gif位于根目录中时才会遵守.gif忽略。
答案 1 :(得分:2)
pathinfo只是一个桶的标签。因此,例如{*pathinfo}
表示将{resource}.axd/
之后的所有内容放入pathinfo。
路由按照您将它们放在路由表中的顺序执行,因此如果您的第一个路由是捕获,则其余路径将永远不会执行。