理解`routes.IgnoreRoute("{resource}.axd/{*pathimfa}")`
Understand `routes.IgnoreRoute("{resource}.axd/{*pathInfo}")`
我正在学习 asp.net MVC 并且对这部分感到困惑。
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
每篇文章,包括 What is routes.IgnoreRoute("{resource}.axd/{*pathInfo}"),都说同样的话,"this code is to ignore requests to axd files."
如果我将代码更改为
routes.IgnoreRoute("{x}.axd/{*y}");
它还能用吗?
花括号里的东西重要吗?
当路由映射到控制器(=class)中的动作(=方法)时,大括号中的'things'很重要。大括号之间指定的名称映射到操作的参数,如下所示:
Account/{action}/{id}/{timestamp}
将参数化以下函数:
public IActionResult Home(int id, DateTime timestamp) { ...
星号 *
表示之后可以出现零个或多个(如在 RegEx 中)路径段。例如 /a/b/c/d/e/...
.
是的,routes.IgnoreRoute("{x}.axd/{*y}")
仍然有效。
占位符 - {placeholderName}
大括号内的值称为 placeholders
。这些只是变量,可以随意命名。在评估传入的 URL 时,名称根本不重要。但是在生成 URL 或计算操作方法参数或模型 属性 值时,这些名称必须匹配。
在 IgnoreRoute
的情况下,没有生成 URL,所以这些名称基本上是句法 surgar。
Catch-All 占位符 - {*placeholderName}
星号 *
表示 包罗万象 占位符。基本上就是说 "match the URL, even if the rest of the segments from here to the end of the URL doesn't match the incoming URL".
正斜线 - /
如本例所示使用包罗万象的占位符时,它表示 1 个或多个 可选 段。由于这些段是可选的,因此最右边的 /
也是可选的。这与使用 Default
路由时的行为相同:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
当最右边的段是可选的并且在 URL (Home/About
) 中没有提供时,这使得最右边的斜杠 /
也是可选的。如果下一个最右边的段也是可选的并被省略,则下一个最右边的 /
也是可选的。这解释了为什么默认路由匹配主页 /
而不是要求 //
才能匹配。
此行为很特殊,仅适用于 /
。如果你有不同分隔符的占位符,例如 {foo}-{bar}
和 bar
被标记为 UrlParameter.Optional
,-
仍然是必需的(事实上, {bar}
是必需的出色地)。 /1-2
匹配,/1-
和/1
不匹配。
查询字符串 - ?key=value&key2=value2
匹配传入路由时完全忽略查询字符串参数。将查询字符串值提供给 MVC 的 ModelBinder
并作为操作方法参数的原因是因为它们稍后在请求中由 处理。
另一方面,在生成 URL 时(例如 ActionLink
),将添加提供的(在请求中或直接提供的)任何剩余的不匹配路由值到生成的 URL 末尾作为查询字符串参数。
@Html.ActionLink("Link", "Home", "About", new { key = "value", key2 = "value2" }, null)
假设 Default
路由,此 ActionLink
将生成 URL
/Home/About?key=value&key2=value2
我正在学习 asp.net MVC 并且对这部分感到困惑。
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
每篇文章,包括 What is routes.IgnoreRoute("{resource}.axd/{*pathInfo}"),都说同样的话,"this code is to ignore requests to axd files."
如果我将代码更改为
routes.IgnoreRoute("{x}.axd/{*y}");
它还能用吗?
花括号里的东西重要吗?
当路由映射到控制器(=class)中的动作(=方法)时,大括号中的'things'很重要。大括号之间指定的名称映射到操作的参数,如下所示:
Account/{action}/{id}/{timestamp}
将参数化以下函数:
public IActionResult Home(int id, DateTime timestamp) { ...
星号 *
表示之后可以出现零个或多个(如在 RegEx 中)路径段。例如 /a/b/c/d/e/...
.
是的,routes.IgnoreRoute("{x}.axd/{*y}")
仍然有效。
占位符 - {placeholderName}
大括号内的值称为 placeholders
。这些只是变量,可以随意命名。在评估传入的 URL 时,名称根本不重要。但是在生成 URL 或计算操作方法参数或模型 属性 值时,这些名称必须匹配。
在 IgnoreRoute
的情况下,没有生成 URL,所以这些名称基本上是句法 surgar。
Catch-All 占位符 - {*placeholderName}
星号 *
表示 包罗万象 占位符。基本上就是说 "match the URL, even if the rest of the segments from here to the end of the URL doesn't match the incoming URL".
正斜线 - /
如本例所示使用包罗万象的占位符时,它表示 1 个或多个 可选 段。由于这些段是可选的,因此最右边的 /
也是可选的。这与使用 Default
路由时的行为相同:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
当最右边的段是可选的并且在 URL (Home/About
) 中没有提供时,这使得最右边的斜杠 /
也是可选的。如果下一个最右边的段也是可选的并被省略,则下一个最右边的 /
也是可选的。这解释了为什么默认路由匹配主页 /
而不是要求 //
才能匹配。
此行为很特殊,仅适用于 /
。如果你有不同分隔符的占位符,例如 {foo}-{bar}
和 bar
被标记为 UrlParameter.Optional
,-
仍然是必需的(事实上, {bar}
是必需的出色地)。 /1-2
匹配,/1-
和/1
不匹配。
查询字符串 - ?key=value&key2=value2
匹配传入路由时完全忽略查询字符串参数。将查询字符串值提供给 MVC 的 ModelBinder
并作为操作方法参数的原因是因为它们稍后在请求中由
另一方面,在生成 URL 时(例如 ActionLink
),将添加提供的(在请求中或直接提供的)任何剩余的不匹配路由值到生成的 URL 末尾作为查询字符串参数。
@Html.ActionLink("Link", "Home", "About", new { key = "value", key2 = "value2" }, null)
假设 Default
路由,此 ActionLink
将生成 URL
/Home/About?key=value&key2=value2