2010-04-07 23 views
4

Cela fonctionne très bien:Comment envoyer une requête GET contenant un deux-points à un contrôleur ASP.NET MVC2?

GET /mvc/Movies/TitleIncludes/Lara%20Croft 

Quand je soumets une demande qui contient deux points, comme celui-ci:

GET /mvc/Movies/TitleIncludes/Lara%20Croft:%20Tomb 

... il génère une erreur 400. L'erreur indique ASP.NET détecté des caractères non valides dans l'URL.

Si la demande-escaping url, je cherche ressemble à ceci:

GET /mvc/Movies/TitleIncludes/Lara%20Croft%3A%20Tomb 

... et cela me donne aussi une erreur 400.

Si je remplace le deux-points par un | :

GET /mvc/Movies/TitleIncludes/Lara%20Croft|%20Tomb 

..that a également été rejeted comme illégale, cette fois avec une erreur 500. Le message: Caractères illégaux dans le chemin.

Échec de l'URL que | résulte dans la même erreur.


Je ne veux vraiment pas utiliser un paramètre de chaîne de requête.


connexes:
Sending URLs/paths to ASP.NET MVC controller actions

Répondre

3

Je trouve que le codage URL ne fonctionne pas, mais le codage personnalisé fait.
Je suppose que ASPNET MVC utilise le système de fichiers pour effectuer l'analyse et le routage, car un caractère dans l'URL qui n'est pas légal dans le système de fichiers provoque une erreur 500 ou 400.

J'ai donc remplacé les deux-points par le caractère unicode ¡du côté javascript, puis faites l'inverse dans l'action. comme ceci:

navigateur:

function myEscape(s){ 
    return s.replace(':', '%C2%A1').trim(); 
} 

dans l'action, appelez cette conversion avant d'utiliser l'argument:

private string MyCustomUnescape(string arg) 
{ 
    return arg.Replace("¡", ":"); 
} 

La même approche fonctionne pour les barres obliques - il suffit de choisir un personnage unicode différent. Bien sûr, si vos arguments string sont eux-mêmes unicode, alors vous devrez utiliser des caractères non-imprimables pour les formes "encodées".

1

Si le référencement n'est pas un problème, vous pouvez utiliser base64, puis urlencode cela. Après la première étape, tous les personnages que vous aurez seront facilement encodés. Décoder dans .NET est aussi simple que d'utiliser l'aide dans System.Web.HttpUtility et System.Convert.

0

répondu ici similaires: https://stackoverflow.com/a/12037000/134761

Utilisez point d'interrogation et esperluette pour les arguments et encode les arguments URL.

Exemple: GET/mvc/Films/TitreInclut?title = Lara% 20Croft% 3A% 20Tomb

Je suis d'accord qu'il serait bien d'encoder des choses dans l'URL, mais il y a probablement une bonne raison de ne pas le faire.