2010-08-16 5 views
1

Je dois passer une chaîne d'URL de la vue au contrôleur, une URL récupérée via jquery. J'ai essayé juste en utilisant le paramètre id dans le routage par défaut, mais cela n'a pas fonctionné. Il n'a pas accepté de chaîne d'URL.Passer le paramètre de la vue au contrôleur via jquery dans MVC 2

Appel du contrôleur par jquery fonctionne très bien, comme ceci:

$('#result').load('Home/Files/' + url); 

Ceci appelle la méthode d'action correcte, mais à moins que je nourris une simple chaîne de texte, il ne fonctionnera pas (je l'ai testé l'alimentation de la variable url une chaîne simple juste pour s'assurer que la méthode a été appelée du tout). Alors, comment puis-je obtenir cette chaîne d'URL pour le contrôleur? J'essaie de penser à la façon de faire le "MVC", et ne pas casser cette façon de penser, donc je ne veux pas utiliser une entrée cachée avec le serveur runat. Pourrait-il être fait avec ViewData? Je ne pouvais penser à aucune façon, je sais seulement comment placer ViewData dans le contrôleur et récupérer la valeur de la vue, pas l'inverse ...

J'ai également essayé d'ajouter un itinéraire personnalisé (avant le route par défaut):

routes.MapRoute(
    "FileManager", // Route name 
    "Home/{action}/{url}", // URL with parameters 
    new { controller = "Home", action = "Files", url = "" } // Parameter defaults 
); 

Mais cela ne fonctionne pas non plus, même problème de ne pas obtenir l'URL pour le contrôleur. Je l'ai seulement fait parce que j'avais vu des suggestions pour les personnes avec des problèmes similaires ici, mais pour être honnête, je ne vois pas comment cela pourrait fonctionner, car en quoi est-ce différent de la route par défaut? Je ne sais pas pourquoi le paramètre {id} semble accepter certaines chaînes (chaînes de format d'id je suppose), mais à moins que je puisse spécifier quel type le paramètre url devrait être je ne vois pas comment ajouter cette route devrait faire une différence ...

Si quelqu'un pouvait m'éclairer, je serais très reconnaissant! Quand j'y pense, puisque je reçois le contenu via un appel ajax avec jquery, je ne suis pas sûr qu'une solution de type ViewData fonctionnerait de toute façon, parce que la page entière n'est pas postée, ou ai-je tort? Gardez à l'esprit que je suis en train d'apprendre MVC et jquery pour le moment, alors s'il vous plaît ne présumez pas que j'ai encore toutes les bases claires :-). Fondamentalement je veux juste pouvoir passer n'importe quel type de chaîne (et probablement d'autres types de données qui n'est pas un id) au contrôleur de la vue ...

EDIT 2: J'ai essayé l'encodeURIComponent suggéré, mais cela n'a pas fonctionné non plus, sauf si je fais quelque chose de mal. Voici mon code:

L'URL (peu importe si j'essaie comme un chemin relatif ou absolu en utilisant file: ///)

<li><a href="#" rel="visual studio 2010/Projects/JsTree/JsTree/">Some text</a> 

Le jquery:

var url; 
$(document).ready(function() { 
    $("a").click(function() { 
     url = encodeURIComponent($(this).attr("rel")); 
     $('#result').load('Home/Files/' + url); 
    }); 
}); 

J'appelle une méthode d'action avec un paramètre id de chaîne. Notez encore que cela fonctionne bien si je passe une chaîne simple, et l'appel à l'action est fait. Mais si j'utilise l'URL ci-dessus, la méthode d'action n'est jamais appelée ... J'ai un point d'arrêt qui n'est jamais atteint s'il y a une URL dans le paramètre!

Répondre

1

Il est très probable que l'URL ne soit pas encodée correctement - essayez d'utiliser encoderURIComponent().

Une autre astuce est de générer l'URL de l'action à l'aide de routage MVC lui-même - URL.ForAction() IIRC - De cette façon, si vous changez vos informations de routage, tous vos JQuery continuera à travailler

+0

Même remarque que pour Nick ci-dessus: ce que je demande vraiment, c'est comment serais-tu capable de passer d'autres types de chaînes, non seulement des URL, mais des chaînes avec des espaces, des chemins de fichiers système, qu'est-ce que tu ... – Anders

+0

Exactement le même mécanisme. L'URI référencé dans le nom fait référence à la facct qu'elle est passée dans une URL _NOT_ que c'est une url qui est en cours d'encodage - Donc toute donnée peut être encodée de cette façon. La méthode javascript générique pour cela est escape() mais cela ne gère pas bien unicode. Voir http://xkr.us/articles/javascript/encode-compare/ pour plus d'informations – Basic

+0

Ce que vous obtiendriez avec quelque chose comme: .load ('Home/Files /' + encodeURIComponent (url) + '/' + encodeURIComponent (SomeOtherParameter)); – Basic

0

Essayez codant pour l'URL avant de passer via encodeURICompoenent() comme ceci:

$('#result').load('Home/Files/' + encodeURIComponent(url)); 

Ce code toutes les chaînes complexes pour passer comme le dernier paramètre, si je comprends bien votre question correctement, cela devrait aider.

+0

Ok, je Je vais vérifier ça. Je suppose que vous voulez dire que je devrais le faire avec la route par défaut en utilisant le paramètre {id}? Mais qu'en est-il des autres paramètres que l'on pourrait vouloir passer? J'ai essayé de passer une chaîne avec des espaces, par exemple. Et il est passé à la méthode d'action, mais est coupé au premier espace. Si j'avais besoin de passer des chemins de fichiers système qui pourraient être un problème par exemple. Alors, comment serait-on généralement capable de passer n'importe quel type de chaîne (ou autre type d'ailleurs)? – Anders

Questions connexes