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):
# < > [ ] | { }
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 )
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 .
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
@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.