0

StackOverflowがこのURLを使用していることに気づきました:

http://stackoverflow.com/posts/123123/revisions

このようなルーティングをASPMVC(3または4)に追加するにはどうすればよいですか?次のようにリビジョン番号を追加したい場合はどうなりますか?

http://stackoverflow.com/posts/123123/revisions/2

これは

  • Controller =posts
  • PostID = 123123
  • SubController = Revisions
  • RevisionID = 2

私の問題は、エンティアルーティングを高度に設定する必要があることです。投稿のルーティングを設定し、特定の投稿リソース間のルーティングをリビジョンと呼ばれるサブリソースに追加できる場合は、投稿リソースを返すルートの後に/リビジョンを追加することもできます。

ありがとう、イド。

4

2 に答える 2

3

このようなルートは、最初に簡単に定義できます。

{controller}/{postId}/{action}/{revisionID}

ただし、一致しすぎる可能性が高くなります。これは、次の2つの方法で軽減できます。

  • 制約を使用して、正の整数(regexなど)を制限postIdします。revision\d+
  • controllerおよびの名前をハードコーディングしますaction

    posts/{postId}/revision/{revisionID}
    

    したがって、このルートをルートのリストの早い段階に配置し、非常に特定のURL形式にのみ一致させることができます。

于 2012-06-24T07:34:08.507 に答える
2

私はあなたを完全に理解したかどうかはわかりませんが、これがあなたがやろうとしていることだと思います。これにより、オプションのリビジョンルートが追加された通常の投稿URLルートを処理できるようになります。

routes.MapRoute(
    "RevisionsRoute",                               // Route name
    "posts/{PostID}/{SubController}/{RevisionID}",  // URL with parameters
    new { 
       controller = "posts", 
       action = "Index", 
       SubController = UrlParameter.Optional, 
       RevisionID = UrlParameter.Optional  
    }                                               // Parameter defaults
);

次に、このルートのコントローラーアクションで、SubControllerまたはRevisionIDパラメーターが存在するかどうかを確認します。

public ActionResult Index(string SubController = null, int RevisionID = -1)
{
    if (SubController != null)
    {
        if (SubController == "revisions")
        {
            // handle revisions route
        }
    }
    else
    {
        // handle normal posts route
    }
}

このようにして、ユーザーは通常の方法で投稿を取得できます。

/posts/1

または、必要な方法での改訂:

/posts/1/revisions/2
于 2012-06-24T07:34:59.333 に答える