背景
在 HomeController.cs
我有:
[HttpGet]
public GetPerson(string name)
{
return View(new PersonModel { ... });
}
在 Global.asax.cs
我有:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Word", "person/{name}",
new { controller = "Home", action = "GetPerson" });
routes.MapRoute(
"Default", "{controller}/{action}",
new { controller = "Home", action = "Index" });
}
在 SomePage.cshtml
中,我实际上有:
@{ var name = "Winston S. Churchill"; }
<a href="@Url.Action("GetPerson", "Home", new { name })">@name</a>
问题
如果我单击 Winston S. Churchill 的链接,我将被路由到 URL http://localhost/person/Winston%20S.%20Churchill
,它会生成标准的 404 页面:
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
只有当 name
变量包含 .
(句点)时才会发生这种情况。 当名称为例如,Winston Churchill
。
如何使 ASP.NET MVC 对 URL 中的 .
(句点)进行 3% 编码?
或者,如果没有 .
(句点)被百分比编码,我怎样才能使路由工作?
Not Acceptable 变通办法(如果没有提供正当理由)
如果我将路由更改为以下内容,一切正常。
routes.MapRoute(
"Word", "person",
new { controller = "Home", action = "GetPerson" });
但是,URL 变成了 http://localhost/person?name=Winston%20S.%20Churchill
,这不是我想要的。我想要 URL 的路径部分中的 name
,而不是查询。
最佳答案
包含句点和未知扩展名的路由被 IIS 解释为静态文件,不会通过 .NET 管道发送。例如,您引用的 URL 被解释为具有 %20Churchill
扩展名的静态文件。
您可以通过将此添加到 web.config
来强制 ASP.NET 处理所有请求:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
您还需要这个来处理以句点结尾的 name
值(而不是只包含一个句点):
<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>
所有 /person/{name}
URL 将由您的 ASP.NET 代码获取。
如果您不想使用此设置,最简单的解决方法是使用自定义编码:
name.Replace(".","--")
关于c# - 自动 URL 参数编码失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157788/