2009-11-11 11 views
3

Selon diverses sources, il est apparemment impossible d'envoyer un chemin comme "/Content/Scripts/jquery.js" en tant que paramètre à l'action MVC, car des barres obliques sont utilisées en tant que délimiteurs de paramètres "/" et ASP.NET MVC renvoie 400 Erreur.Envoyer des URL/chemins aux actions du contrôleur ASP.NET MVC

La seule solution de travail que j'ai trouvé jusqu'ici était de coder Base64 telle chaîne, l'envoyer comme une valeur de paramètre et de le décoder dans l'action du contrôleur. J'encode le chemin vers le fichier JS comme ceci:

http://localhost/vdir/Services/GetJavaScript/=L3JzaDIwMTAvQ29udGVudC9XaWRnZXRGcmFtZXdvcmsvd2lkZ2V0Lmpz/=aHR0cDovL2xvY2FsaG9zdA==

J'ai besoin parce que j'utiliser les actions de contrôleur qui retournent JavaScriptResult pour injecter minified et JavaScript modifié dans la page et je ne veux pas utiliser des gestionnaires http dans ce cas.

La question: est-ce vraiment le seul moyen avec ASP.NET MVC? Parce qu'il ne semble pas trop facile d'utilisation, pas que de nombreux utilisateurs ne partirez à la source de la page, mais de toute façon ...;)

Répondre

1

Vous pouvez utiliser la "ancienne" approche querystring:

http://localhost/vdir/Services/GetJavaScript?script=/Content/Scripts/jquery.js

Et avez juste votre méthode GetJavaScript accepter une chaîne appelée script:

public ActionResult GetJavaScript(string script) 
+0

L'URL de l'itinéraire ne peut pas commencer par un caractère '/' ou '~' et ne peut pas contenir de '?' personnage. – mare

+0

Vous devez avoir quelque chose dans vos règles de routage qui cause cette erreur. J'ai créé une application ASP.NET MVC rapide et sale pour tester cela avant de poster et cela a fonctionné. Je viens d'utiliser les routes par défaut. À quoi ressemblent vos routes? – PatrickSteele

+0

Comme il s'avère que cela fonctionne et c'est en fait la manière la plus propre. Assurez-vous simplement que vous avez des paramètres d'action nommés de la même manière que les paramètres QueryString. Et ils n'ont pas à faire partie d'une route MVC. Par exemple: routes.MapRoute ("GetJavaScriptService", RouteType.Regular, "Services/GetJavaScript", nouveau {controller = "Services", action = "GetJavaScript"}, null); Et l'action: publique JavaScriptResult GetJavaScript (string jsPath) {...} Et la demande: VirtualDir/GetJavaScript?jsPath = URL_Encoded_JS_path Une autre technique qui a fonctionné pour moi était la conversion de params en base64 – mare

0

Tu ne peux pas remplacer tout le / avec un autre personnage, comme |? Cela rendra l'URI propre, mais n'interférera pas avec le routage. Si tous vos scripts se trouvent dans le même répertoire, vous pouvez simplement utiliser la valeur par défaut et supprimer le chemin de la référence, évitant ainsi complètement le problème.

+0

cela pourrait fonctionner peut-être. – mare

Questions connexes