ASP MVC Routing van subresources

Ik heb gemerkt dat StackOverflow deze URL gebruikt:

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

Hoe kan ik zo'n routering toevoegen aan ASP MVC (3 of 4)? Wat als ik het nummer van de revisie als volgt wil toevoegen:

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

welke vertalen naar

  • Controller = berichten
  • postId = 123123
  • subbesturingseenheid = herzieningen
  • RevisionId = 2

Mijn probleem is dat ik de entierrouting in geavanceerd moet instellen. Als ik routering van berichten kan instellen en routing kan toevoegen tussen een specifieke postresource naar subresource die revisies worden genoemd, kan ik ook toevoegen/reviseren na elke route die resource retourneren.

Dank je, Ik doe.

0

2 antwoord

Zo'n route is eenvoudig te definiƫren aan het begin:

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

Maar het is zeer waarschijnlijk dat te veel overeenkomt. Dit kan op twee manieren worden opgelost:

  • Use constraints to limit postId and revision to positive integers (eg. regex \d+).
  • Hard code the name of controller and action:

    posts/{postId}/revision/{revisionID}
    

    and thus allow this route to be placed early in the list of routes while only matching the very specific URL format.

3
toegevoegd

Ik weet niet zeker of ik je heb begrepen, maar ik denk dat dit is wat je probeert te doen. Hiermee kunt u een normale Posts URL-route afhandelen, met een optionele Revisies -route toegevoegd.

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
);

Controleer vervolgens in de actie van de controller voor deze route of er parameters SubController of RevisionID aanwezig zijn.

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

Op deze manier kan de gebruiker een bericht op de normale manier krijgen:

/posts/1

Of een herziening zoals u dat wilt:

/posts/1/revisions/2
2
toegevoegd