web-dev-qa-db-fra.com

URL avec barre oblique en paramètre?

Question:

Je crée un logiciel wiki, essentiellement un clone de wikipedia/mediawiki, mais dans ASP.NET MVC (le MVC est le point, alors ne me recommandez pas ScrewTurn).

Maintenant, j'ai une question:

J'utilise ce mappage d'itinéraire pour acheminer une URL comme:
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
        );

Maintenant, il m'est venu à l'esprit qu'il pourrait y avoir des titres comme 'AS/400':
http://en.wikipedia.org/wiki/AS/4

Soit dit en passant, il y a aussi celui-ci (titre 'Slash'):
http://en.wikipedia.org/wiki//

Et celui-là:
http://en.wikipedia.org/wiki//dev/null

Dans l'ensemble, Wikipedia semble avoir une liste de titres intéressants comme celui-ci: http://en.wikipedia.org/wiki/Wikipedia:Articles_with_slashes_in_title

Comment puis-je créer des itinéraires comme celui-ci correctement?

Modifier:
Quelque chose comme:
Si l'URL commence par/Wiki/et si elle ne commence pas par/wiki/Edit/(mais pas/Wiki/Edit), passez tout le reste de l'URL en tant qu'ID.

Modifier:
Hmm, juste un autre problème: Comment puis-je acheminer celui-ci:
http://en.wikipedia.org/wiki/C&A

Wikipédia peut ...

Modifier:
Selon wikipedia, en raison de conflits avec la syntaxe wikitext, seuls les caractères suivants ne peuvent jamais être utilisés dans les titres de page (ni pris en charge par DISPLAYTITLE):

# < > [ ] | { }

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_ (technical_restrictions) #Forbidden_characters

Modifier:
Pour autoriser * et &, mettez

<httpRuntime requestPathInvalidCharacters="" />

dans la section <system.web> du fichier web.config

(Trouvé ici: http://www.christophercrooker.com/use-any-characters-you-want-in-your-urls-with-aspnet-4-and-iis )

63
Stefan Steiger

Vous pouvez utiliser une route catchall pour capturer tout ce qui suit la partie wiki de l'url dans le jeton id:

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

Maintenant, si vous avez la demande suivante: /wiki/AS/400 il sera mappé à l'action suivante sur le contrôleur Wiki:

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

Autant que /wiki// est préoccupé. Je pense que vous obtiendrez une erreur 400 Bad Request du serveur Web avant que cette demande n'atteigne le pipeline ASP.NET. Vous pouvez vérifier le article de blog suivant .

91
Darin Dimitrov

dans Attribute Routing en mvc j'ai eu le même problème avec / dans la chaîne abc/cde dans HttpGet

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

vous devez donc placer * car après cela il sera considéré comme paramètre

13
Usman

@Darin: Eh bien, c'est évident, la question est: pourquoi? contrôleur + action + id sont donnés, c'est comme si ça passait tout ça à nouveau au routage ... - Quandary 13 juin 11 à 17:38

Quandry - vous l'avez peut-être déjà compris depuis que votre question a plus d'un an, mais lorsque vous appelez RedirectToAction, vous envoyez en fait une réponse HTTP 302 au navigateur, ce qui oblige le navigateur à faire une demande GET pour l'action spécifiée. Par conséquent, la boucle infinie que vous voyez.

Voir: Méthode Controller.RedirectToAction

5
Adam