4

Ma page comporte un bouton de soumission (bouton côté serveur).ASP.NET/JavaScript - Problème d'enregistrement/de redirection de script

Voici mon code pour l'événement clic:

protected void SubmitButton_Click(object sender, EventArgs e) 
{ 
    db.SaveSomething(); 
    Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData"); 
    Response.Redirect("SomeOtherPage.aspx"); 
} 

Maintenant, le problème est, j'enregistrer le JavaScript en utilisant Page.ClientScript.RegisterStartupScript, mais cela n'a pas d'effet que la page n'est pas nouveau rendu sur postback (qui est où le script serait exécuté), car à la place un Response.Redirect se produit.

La seule solution que je peux penser est de rendre la page que je redirige à "conscient" que im essayant d'exécuter du JavaScript, que ce soit QueryString, HttpContext.Current.Items, ou (gulp) Session.

  • QueryString - ce n'est pas une option, car JavaScript essaie de s'exécuter.
  • HttpContext.Current.Items - également pas une option parce que je fais un Response.Redirect (qui perd les données au niveau de la demande, et je ne peux pas non plus utiliser Server.Transfer parce que cela ne fonctionne pas bien avec la réécriture d'URL).
  • Session - bien sûr, mais pas idéal.

D'autres idées/suggestions?

EDIT pour la clarification:

Le JavaScript im exécution est un appel à une API côté client Facebook pour publier sur le mur de l'utilisateur. Cela doit être fait côté client. Je passe au script des choses comme "titre", "message", "liens d'action", etc. Fondamentalement un tas de JSON. Mais la clé ici est que ces données sont créées sur la publication, donc je ne peux pas simplement exécuter cette fonction sur le clic côté client.

Donc ce que j'essaie d'accomplir est de cliquer sur le bouton Soumettre, d'exécuter du javascript et de faire une redirection (ne doit pas forcément être dans cet ordre, juste les deux doivent se produire).

+0

Ce serait bien si vous pouviez décrire «quoi» vous essayiez d'accomplir car il pourrait y avoir une meilleure solution au problème. Il y a plusieurs façons de résoudre le problème, mais il y en a aussi beaucoup qui peuvent ne pas convenir à votre situation particulière. – Josh

+0

@Josh - question étendue. Rien de mieux? – RPM1984

+0

La publication inter-pages n'est-elle pas une option? –

Répondre

5

Je pense que ce que vous éprouvez est le malheureux affrontement de deux paradigmes différents ici. D'un côté vous avez une API de style AJAX dont vous voulez profiter, et de l'autre côté vous avez le modèle de publication de page ASP.Net. Maintenant, bien que ces deux ne s'excluent pas mutuellement, ils peuvent présenter quelques défis. Je suis d'accord avec Dan que votre meilleur pari est de se pencher un peu plus vers l'approche AJAX au lieu de l'inverse.

Une fonctionnalité intéressante dans ASP.Net est la possibilité de transformer une seule méthode statique de votre page en un pseudo service Web. Vous pouvez ensuite utiliser le ScriptManager pour générer des classes proxy côté client pour appeler cette méthode pour vous, mais vous pouvez utiliser whatever client side library you want.

Un exemple très simple:

Dans votre codebehind pour vous la page

[WebMethod] 
public static Person GetPerson(Int32 id, String lastName) 
{ 
    return DataAccess.GetPerson(id, lastName); 
} 

Si vous utilisez la bibliothèque AJAX ASP.Net pour gérer cela pour vous, alors vous devez activer les méthodes de page pour générer les proxies côté client.

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"> 
</asp:ScriptManager> 

Ensuite, vous pouvez appeler cela de script côté client comme ceci:

function CallGetPerson() 
{ 
    var id = $get("txtPersonId").value; 
    var lastName = $get("txtLastName").value; 
    // PageMethods is a class that is part of the ASP.Net AJAX 
    // client-side libraries and will contain your auto-generated 
    // proxy methods for making XHR requests. 
    PageMethods.GetPerson(id, lastName, OnGetPersonComplete); 
} 

function OnGetPersonComplete(result) 
{ 
    faceBookApi.DoSomeStuffWithJson(result); 
    window.location = "NewPage.aspx"; 
} 

Maintenant encore une fois, ceci est un exemple artificiel, et ce que vous envoyez des messages sur le serveur peut être très compliqué, mais vous obtenez l'idée générale de ce qui peut être accompli en utilisant les composants intégrés du framework.

J'espère que cela aide.

+0

merci Ouais, je sais comment utiliser les méthodes de page ajax, mais le problème est, la forme est assez compliquée (beaucoup de champs, beaucoup de autre logique) Je devrais encapsuler toute cette logique dans la méthode web - pas idéale, ce qui est important pour le moment est d'envelopper le formulaire dans un UpdatePanel, et de le faire de cette façon (old school ajax, par rapport à la bonne façon C'est ce que vous avez dit.) Cela étant dit, c'est une bonne réponse (que les upvotes montrent), donc je vous donne la réponse – RPM1984

+0

Je craignais que la forme soit trop compliquée pour cela, mais peut-être que L'utilisation de publications partielles sur une page est une méthode peu fructifiante, mais Vous devez utiliser ScriptManager.RegisterStartupScript car Page.ClientScript ne fonctionnera pas pendant une publication partielle car seul le contenu du panneau de mise à jour sera actualisé. – Josh

2

Si vous utilisez Response.Redirect, le script Java que vous avez enregistré à la ligne précédente ne sera pas exécuté. Je pense que ce que vous voulez faire après avoir cliqué sur le bouton Envoyer est:

  1. Enregistrer quelque chose
  2. Exécuter javascript
  3. Rediriger vers une autre page

Ici, vous pouvez utiliser:

protected void SubmitButton_Click(object sender, EventArgs e) 
{ 
    db.SaveSomething(); 
    Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData"); 
    Page.ClientScript.RegisterStartupScript("window.location.href=XXXXXX"); 
} 

En d'autres termes, en utilisant javascript pour rediriger la page au lieu de Response.Redirect.

+0

J'ai pensé à cela, mais cela rendrait le rendu de la page, puis faire une redirection après le chargement de la page. Pas bon UX IMO – RPM1984

+0

Lorsque vous cliquez sur le bouton soumettre, bien sûr, il actualisera la page. Donc vous ne voulez pas de rafraîchissement? –

+0

vous ne comprenez pas. Cliquez sur le bouton Soumettre de la première page, cela reporte sur le serveur, qui fait ensuite un Response.Redirect - de sorte que la page SECOND est rendue. Donc, il ne rafraîchit pas la même page (ce qui arriverait par défaut, si je n'ai pas un Response.Redirect), il rend la deuxième page. Sais ce que je veux dire? – RPM1984

0

Pourriez-vous exécuter le JavaScript sur la deuxième page?

À part cela, vos options sont quelque peu limitées. Vous pouvez utiliser AJAX pour obtenir les données dont vous avez besoin du serveur, puis rediriger. Cela améliorerait l'UX car au minimum vous n'auriez pas de chargement de page supplémentaire pour exécuter votre JavaScript intermédiaire.


Une autre option serait d'utiliser Server.Transfer(...), qui fonctionne de façon similaire à Response.Redirect, mais il ne transmet pas un en-tête de redirection vers le client. Il indique simplement au serveur "arrêter d'exécuter la page en cours et commencer à exécuter une nouvelle page". Context.Items restera dans la portée entre les 2 classes parce que vous transférez seulement la responsabilité de répondre à la demande, pas le contexte entier de la demande.


Vous pouvez également combiner ces 2 solutions. Utilisez Server.Transfer pour conserver les valeurs Context.Items dans la portée, puis affichez le JS sur la deuxième page en utilisant les valeurs que vous avez conservées dans la première page.

+0

merci. J'ai essayé Server.Transfer et HttpCOntext.Current.items (comme ma question l'a indiqué), mais j'ai rencontré des problèmes avec la réécriture d'URL (Server.Transfer ne fonctionnerait pas avec "~/somecleanurl", il devait être "~/pages/somepage.aspx ".Mais je ne pensais pas à AJAX, pourrait donner un aller .. – RPM1984