理解`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