【问题标题】:Understand `routes.IgnoreRoute("{resource}.axd/{*pathInfo}")`了解`routes.IgnoreRoute("{resource}.axd/{*pathInfo}")`
【发布时间】:2018-06-30 11:20:04
【问题描述】:

我正在学习 asp.net MVC,被这部分弄糊涂了。

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

每一篇文章,包括What is routes.IgnoreRoute("{resource}.axd/{*pathInfo}"),都说了同样的话,“这段代码是为了忽略对axd文件的请求。”

如果我将代码更改为

routes.IgnoreRoute("{x}.axd/{*y}");

它仍然有效吗?

大括号里的东西重要吗?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-routing


    【解决方案1】:

    当路由映射到控制器(=类)中的动作(=方法)时,大括号中的“事物”很重要。花括号之间指定的名称映射到操作的参数,如下所示:

    Account/{action}/{id}/{timestamp}

    将参数化以下函数:

    public IActionResult Home(int id, DateTime timestamp) { ...

    星号* 表示之后可以出现零个或多个(如在 RegEx 中)路径段。例如/a/b/c/d/e/...

    【讨论】:

    • ok.. 如果 url 是 http://server/application/WebResource.axd?d=...,它会匹配模式吗?我的意思是“axd”之后有一个问号,而在模式中它是“axd”之后的斜线。
    • 查询字符串可以映射到url。如我上面的示例,URL /Account/Home/123?timestamp=... 仍将匹配模板中的参数。对于pathInfo,它会被忽略,因为它会捕获所有内容。
    • 路由在匹配传入请求时完全忽略查询字符串,因此它将匹配URL是否具有查询字符串值。
    • @NightOwl888 它并没有完全忽略它们。查询字符串是最后一段的一部分,稍后由模型绑定器拾取。如图所示here
    • 是的,但这与路由无关。这样做是因为value providers。路由评估 URL 的路径,除非它是自定义的。
    【解决方案2】:

    是的,routes.IgnoreRoute("{x}.axd/{*y}") 仍然有效。

    占位符 - {placeholderName}

    大括号内的值称为placeholders。这些只是变量,可以随意命名。在评估传入的 URL 时,名称根本不重要。但在生成 URL 或计算操作方法参数或模型属性值时,这些名称必须匹配。

    IgnoreRoute 的情况下,没有生成任何 URL,所以这些名称基本上是句法上的 surgar。

    Catch-All 占位符 - {*placeholderName}

    星号* 表示catch-all 占位符。它基本上是在说“匹配 URL,即使从这里到 URL 末尾的其余部分与传入的 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 并作为操作方法参数,是因为它们稍后在请求中由 value providers 处理。

    另一方面,在生成 URL 时(例如 ActionLink),任何剩余的不匹配路由值(在请求中或直接提供)都将作为查询添加到生成的 URL 的末尾字符串参数。

    @Html.ActionLink("Link", "Home", "About", new { key = "value", key2 = "value2" }, null)
    

    假设Default路由,这个ActionLink会生成URL

    /Home/About?key=value&key2=value2
    

    【讨论】:

    • 如果我的网址是http://server/application/WebResource.axd?d=...,“{resource}.axd/{*pathInfo}”中的斜线是否匹配?你能解释一下匹配吗?
    猜你喜欢
    • 2012-02-19
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2015-04-14
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多