ASP.NET MVC téléchargement de fichier et jQuery paramètre
J'ai un (ViewResult) Contrôleur qui reçoit un paramètre de chaîne, génère un fichier PDF, et envoie le fichier PDF dans le navigateur. J'ai testé le contrôleur lui-même, et il fonctionne très bien. Malheureusement, lorsque j'essaie de poster sur ce contrôleur de dollars.ajax jQuery fonction (passage d'une simple chaîne de caractères), le Contrôleur de toujours reçoit le paramètre de chaîne de valeur null. J'en ai essayé des centaines de différentes configurations de l' $.ajax fonction. Voici le contrôleur, qui renvoie un fichier PDF dans le navigateur (ça marche...tant que je créer le code HTML à l'intérieur de la méthode):
[HttpPost]
public ActionResult HtmlToPdf(String htmlData)
{ }
Voici le jQuery je suis à l'aide de mon point de vue (déclenchée par un clic sur un bouton):
function getPdf() {
var htmlData = “blah, blah, etc.”;
$.ajax({
url: '/Home/HtmlToPdf',
type: 'post',
data: JSON.stringify(htmlData),
contentType: 'application/json; charset=utf-8',
success: handleSuccess,
error: handleError
});
}
J'ai essayé de 'post', 'get', json, texte, html, stringify, différents types de contenu, etc. Personne ne sait comment correctement envoyer une chaîne de caractères (la var 'htmlData' ci-dessus) à un contrôleur? Post? Obtenir? Quelque chose d'autre? Merci.
data: htmlData
Essayé de cette façon. Toujours null.
Hmmm, j'ai eu des problèmes comme ça avant...je l'avais supprimer le
contentType
partie, j'ai trouvé que même lors de l'encodage comme vous l'avez fait (même avec le bon type), en l'enlevant, MVC permettra de déchiffrer correctement. Juste mes 2 cents 😉Essayez d'utiliser Rasoir pour encoder l'Url ainsi, quelque chose comme @Url.Action("myAction", "myController")`
OriginalL'auteur TheDudeDude | 2013-12-19
Vous devez vous connecter pour publier un commentaire.
Vous devez l'envoyer comme un objet json:
Vous avez alors accès à HomeController en déclarant simplement comme un argument comme vous l'avez fait. Le point est que vous avez besoin pour passer le nom de l'argument dans le cadre de l'objet JSON. Le fait que vous nom de la variable est aussi "htmlData' est pas pertinent. Le ci-dessus pourrait tout aussi bien être ...
Bien évidemment, de multiples arguments que vous venez de plus d'éléments dans votre objet...
... avec ...
Si vous souhaitez passer un tableau ajouter
traditional:true
à la$.ajax
argument objet.Je remarque aussi que j'ai toujours mis "POST" en majuscules car, si vous regardez la documentation ici la
datatype:
arguments (ex: 'json') sont listés en bas de casse, mais " GET " et "POST" pourtype:
sont en majuscules.---------------------------- Mise à jour -------------------------
Comme mentionné dans les commentaires, pour un simple téléchargement de fichier, il est probablement plus facile d'utiliser un GET.
Le contrôleur de base est quelque chose comme (je suis à la coupe vers le bas code donc n'ai pas testé ce)
Puis dans le javascript n':
De toute évidence, cela télécharge un fichier de texte de sorte que vous aurez besoin de jouer avec le codage (probablement/probablement n'en a pas besoin?) et contentType chaîne pour en PDF (je pense que c'est juste 'application/PDF'). Aussi, pour le répète, je n'ai pas testé ce code exact, juste modifié la logique d'une application existante. Bonne chance.
(en réponse à votre mise à jour ci-dessus): C'est trop simple! Je vais essayer lundi. FWIW, je suis la seule .NET dev au travail qui jamais les entreprises en jQuery(!). Merci encore.
"La jqXHR.success(), jqXHR.erreur(), et jqXHR.complet() rappel méthodes introduites dans jQuery 1.5 est déprécié que de jQuery 1.8."
OriginalL'auteur StarNamer
Essayer d'envoyer votre
data
comme un objet json et le réglage de ladataType
à'json'
:Ah, autre chose: si j'utilise la syntaxe ci-dessus (données: { htmlData: htmlData }), la fonction renvoie la fonction d'erreur. Je ne sais pas pourquoi. Si je viens de l'utiliser [données: htmlData], le contrôleur est appelé avec succès. :-p
avez-vous d'ajouter le
dataType: 'json'
lorsque vous l'a envoyé en tant que json?si cela ne marche toujours pas pour vous, un autre à faire est d'essayer de supprimer le
dataType
de la propriété et de changer à nouveau votredata
bien être comme ceci:data: $.param({htmlData: htmlData })
. Le problème avec l'exemple de votre question, c'est que les données que vous envoyez n'a pas une paire clé/valeur, de sorte que lorsque MVC reçoit, c'est juste une chaîne brute, plutôt que de véritables HTTP POST/GET paramètres, il peut correspondre à l'action. Les versions que j'ai proposé d'envoyer des données post commehtmlData=blah%2C+blah%2C+etc.
qui MVC, en théorie, doit interpréter correctement...OriginalL'auteur Alconja
Merci pour les réponses. Je pense que tous ont été correct et bon. J'ai renoncé à celui-ci, néanmoins, parce que je pense que j'essayais de faire quelque chose qui n'est pas vraiment possible: l'envoi d'un appel ajax vers le serveur et le fait que le serveur à "finir le travail" en revenant d'un fichier binaire pour le navigateur (en format PDF). La fonction ajax était en cours d'exécution, l'obtention d'un message de succès, et le succès de la fonction. Perdu dans tout cela est le fait que le navigateur était supposé être la réception d'un fichier de réponse, pas une réponse ajax. Désolé si je ne suis pas à l'expliquer très bien. De toute façon, j'ai laissé tomber en arrière et écartaient: je suis de la génération de mon dossier par le rendu d'une .NET rapport.rdlc) sous forme de fichier PDF et de l'envoyer au navigateur. Brut, mais efficace. Avec le recul, je ne pense pas que l'ajax était encore le chemin à parcourir sur ce. :-p. Merci encore pour l'aide.
Oh, belle réponse! Je n'avais pas pensé à deux Postes. Je pense que je vais revoir, merci!
OriginalL'auteur TheDudeDude
À l'aide de la double méthode POST et gratuit jQuery extension 'fileDownload" de ici
Qui, fondamentalement, enveloppements d'un POSTE dans un bout de code qui permet de manipuler une partie de la complexité...
Nous avons (avec de gros morceaux enlevés (!)...
Avec les méthodes du controller (coupés)
Évidemment, c'est explicitement le contrôle de ce qui se passe dans la reponse.
Espérons que cette aide!/
OriginalL'auteur StarNamer