我问的原因是因为 IIS 保护某些 ASP.NET 文件夹,如 Bin、App_Data、App_Code 等。即使 URL 没有映射到实际的文件系统文件夹,IIS 也会拒绝路径段等于其中之一的 URL提到的名字。
这意味着我不能有这样的路线:
{controller}/{action}/{id}
...其中 id 可以是任何字符串,例如
Catalog/Product/Bin
因此,与其禁用此安全措施,我更愿意更改路由,在 id 前使用后缀,如下所示:
{controller}/{action}_{id} // e.g. Catalog/Product_Bin
{controller}/{action}/_{id} // e.g. Catalog/Product/_Bin
但是,如果 id 包含新的分隔符,则这些路由将不起作用,在这种情况下为 _,例如
// These URL won't work (I get 404 response)
Catalog/Product_Bin_
Catalog/Product/_Bin_
Catalog/Product/__Bin
为什么?我不知道,对我来说看起来像一个错误。如何使这些路由起作用,其中 id 可以是任何字符串?
最佳答案
好的,我有一个明确的答案。是的,这是一个错误。但是,在这一点上,我很遗憾地说我们没有计划修复它,原因有两个:
您可以做的是将 URL 更改为不包含下划线:
{controller}/{action}/_{id}
然后添加一个路由约束,要求 ID 参数以下划线字符开头。
然后在您的操作方法中,您从 id 参数中删除下划线前缀。如果您愿意,您甚至可以编写一个 Action 过滤器来为您执行此操作。带来不便敬请谅解。
关于ASP.NET 路由 : Literal sub-segment between tokens, 并使用文字子段中的字符路由值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4318373/