我正在学习asp.net MVC并对此部分感到困惑。
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
每篇文章,包括What is routes.IgnoreRoute("{resource}.axd/{*pathInfo}"),都说同样的话,“这段代码是忽略对axd文件的请求。”
如果我将代码更改为
routes.IgnoreRoute("{x}.axd/{*y}");
它仍然有效吗?
大括号中的内容是否重要?
答案 0 :(得分:2)
是的,routes.IgnoreRoute("{x}.axd/{*y}")
仍然可以使用。
{placeholderName}
大括号内的值称为placeholders
。这些只是变量,可以根据需要命名。在评估传入的URL时,名称根本不重要。但是,在生成URL或计算操作方法参数或模型属性值时,这些名称必须匹配。
在IgnoreRoute
的情况下,没有生成URL,因此这些名称基本上都是语法上的。
{*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)路径段。例如*
。