c# - 自动 URL 参数编码失败

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

背景

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/

相关文章:

asp.net-mvc - CheckboxFor 不绑定(bind)嵌套对象

asp.net-mvc-routing - 在 .NET MVC 4.0 URL 结构中强制使用连字符

c# - Json.NET 将数组反序列化为属性

c# - 不支持 URI 前缀

c# - 有没有办法让 System.IO.Directory.GetFiles(string) 在程序目录中查找?

asp.net-mvc - 使用 asp.net mvc 使某个枚举值的验证失败

c# - 如何在不违反 MVC 模式的情况下实现缓存模型?

c# - Crystal Reports 和 .NET 4 - 无法加载文件或程序集(使用 LegacyV2RuntimeActivationPolicy ="false")crdb_adoplus.dll

asp.net-mvc - MVC-如何从具有包含点字符的参数名称的获取请求中获取参数值

asp.net - 使用自定义路径时忽略 ServiceStack web.config 设置