web-dev-qa-db-ja.com

パラメータにスラッシュが含まれるURLですか?

質問:

基本的にはwikipedia/mediawikiのクローンであるwikiソフトウェアを作成していますが、ASP.NET MVCでは(MVCがポイントなので、ScrewTurnをお勧めしません)。

今、私は質問があります:

このルートマッピングを使用して、次のようなURLをルーティングします。
http://en.wikipedia.org/wiki/ASP.NET

        routes.MapRoute(
            "Wiki", // Routenname
            //"{controller}/{action}/{id}", // URL mit Parametern
            "wiki/{id}", // URL mit Parametern
            new { controller = "Wiki", action = "dbLookup", id = UrlParameter.Optional } // Parameterstandardwerte
        );

「AS/400」のようなタイトルがあるかもしれないということが今私に思い浮かびました:
http://en.wikipedia.org/wiki/AS/4

偶発的に、これもあります(タイトル 'スラッシュ'):
http://en.wikipedia.org/wiki//

そしてこれは:
http://en.wikipedia.org/wiki//dev/null

全体として、ウィキペディアには次のような興味深いタイトルのリストがあるようです。 http://en.wikipedia.org/wiki/Wikipedia:Articles_with_slashes_in_title

このルートのようなルートを正しく作成するにはどうすればよいですか?

編集:
何かのようなもの:
URLが/ Wiki /で始まり、/ wiki/Edit /で始まらない場合(ただし/ Wiki/Editではない場合)、URLの残りすべてをIDとして渡します。

編集:
うーん、もう1つの問題:これをルーティングするにはどうすればよいですか:
http://en.wikipedia.org/wiki/C&A

ウィキペディアは...

編集:
Wikipediaによると、wikitext構文との衝突のため、次の文字のみをページタイトルで使用することはできません(DISPLAYTITLEでサポートされていません)。

# < > [ ] | { }

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_(technical_restrictions)#Forbidden_​​characters

編集:
*および&を許可するには、

<httpRuntime requestPathInvalidCharacters="" />

ファイルweb.configのセクション<system.web>へ

(ここにあります: http://www.christophercrooker.com/use-any-characters-you-want-in-your-urls-with-aspnet-4-and-iis

63
Stefan Steiger

キャッチオールルートを使用して、URLのwiki部分に続くすべてをidトークンにキャプチャできます。

routes.MapRoute(
    "Wiki",
    "wiki/{*id}",
     new { controller = "Wiki", action = "DbLookup", id = UrlParameter.Optional }
);

次のリクエストがある場合:/wiki/AS/400Wikiコントローラー上の次のアクションにマップします。

public ActionResult DbLookup(string id)
{
    // id will equal AS/400 here
    ...
}

の限り /wiki//が心配です。このリクエストがASP.NETパイプラインに到達する前に、Webサーバーから400 Bad Requestエラーを受け取ると思います。 ブログ投稿をフォロー をチェックアウトできます。

91
Darin Dimitrov

Attribute Routing in mvc / in string _abc/cde in HttpGetで同じ問題が発生しました

        [Route("verifytoken/{*token}")]
        [AllowAnonymous]
        [HttpGet]
        public ActionResult VerifyToken(string token)
        {
          //logic here
        }

したがって、*を配置する必要があります。これは、この後にパラメーターと見なされるためです

13
Usman

@Darin:それは明らかです、質問は次のとおりです。コントローラー+アクション+ IDが指定されているため、これらすべてを再びルーティングに渡しているようです...-Quandary 11年6月13日17:38

質問-あなたの質問は1年以上前のものであるため、すでにこれを理解しているかもしれませんが、RedirectToActionを呼び出すと、実際にはHTTP 302応答を送信していますこれにより、ブラウザは指定されたアクションに対してGETリクエストを行います。したがって、あなたが見ている無限ループ。

参照: Controller.RedirectToAction Method

5
Adam