理解`routes.IgnoreRoute(“{resource} .axd / {* pathInfo}”)`

时间:2018-01-21 20:08:47

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

我正在学习asp.net MVC并对此部分感到困惑。

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

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

如果我将代码更改为

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

它仍然有效吗?

大括号中的内容是否重要?

2 个答案:

答案 0 :(得分:2)

是的,routes.IgnoreRoute("{x}.axd/{*y}")仍然可以使用。

占位符 - {placeholderName}

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

IgnoreRoute的情况下,没有生成URL,因此这些名称基本上都是语法上的。

Catch-All Placeholder - {*placeholderName}

星号*表示 catch-all 占位符。它基本上是说“匹配URL,即使从此处到URL末尾的其余段与传入的URL不匹配”。

正斜线 - /

当使用此示例中的catch-all占位符时,它表示一个或多个可选段。由于这些细分是可选的,因此最右侧/也是如此。使用Default路由时,这是相同的行为:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

如果最右边的细分受众群是可选的,并且未在网址(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将生成网址

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

答案 1 :(得分:1)

当路径映射到Controller(= class)中的Action(= method)时,花括号中的'things'很重要。大括号之间指定的名称映射到动作的参数,如下所示:

A*

将参数化以下函数:

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

星号public IActionResult Home(int id, DateTime timestamp) { ...表示此后可能出现零或多(如RegEx)路径段。例如*