1

バックグラウンド

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 エラー 404.0 - 見つかりません

お探しのリソースは削除されているか、名前が変更されているか、一時的に利用できません。

nameこれは、変数に.(ピリオド)が含まれている場合にのみ発生します。たとえば、名前がWinston Churchill.

.ASP.NET MVC 3で URL の (ピリオド) をパーセント エンコードするにはどうすればよいですか?

.または、 (ピリオド) をパーセントでエンコードせずにルーティングを機能させるにはどうすればよいですか?

受け入れられない回避策 (正当な理由なしに提示された場合)

ルートを次のように変更すると、すべてが機能します。

routes.MapRoute(
    "Word", "person",
     new { controller = "Home", action = "GetPerson" });

ただし、URL は になりhttp://localhost/person?name=Winston%20S.%20Churchill、これは私が望むものではありません。nameクエリではなく、URL のパス部分が必要です。

4

1 に答える 1

5

ピリオドと不明な拡張子を含むルートは、IIS によって静的ファイルとして解釈され、.NET パイプライン経由で送信されません。たとえば、引用した URL は%20Churchill拡張子付きの静的ファイルとして解釈されます。

これを に追加することで、ASP.NET にすべての要求を強制的に処理させることができますweb.config

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

nameピリオドで終わる値を処理するには、これも必要です(ピリオドを含むだけではなく)。

<system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>

その後、すべての/person/{name}URL が ASP.NET コードによって取得されます。

この設定を使用したくない場合、最も簡単な回避策はカスタム エンコーディングを使用することです。

name.Replace(".","--")
于 2013-08-10T01:42:31.990 に答える