2009-04-24 4 views
0

Lorsque j'appelle un ScriptMethod à partir d'un bouton ASP.NET à l'aide de la propriété OnClientClick, le ScriptMethod renvoie 95% du temps (la zone d'alerte s'affiche) et la page soumet.Appel d'un ScriptMethod sur la soumission d'un formulaire?

Si j'appelle la méthode à partir d'un bouton d'entrée HTML, ScriptMethod renvoie 100% du temps, mais bien sûr, la page n'est pas soumise. Si je change le type à soumettre, je reviens aux 95% suivants.

Dois-je changer mon approche, et appeler de soumettre javascript après mes déclarations ScriptMethod, ou est-il un moyen de faire cela réussir 100% du temps? Par succès, je veux dire en fait renvoyer 100% du temps avant que le formulaire ne le soumette. Le ScriptMethod n'échoue jamais réellement.

Page:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ScriptServiceMadness._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Untitled Page</title>  
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server"> 
      <Services> 
       <asp:ServiceReference Path="Chewbacca.asmx" /> 
      </Services> 
     </asp:ScriptManager> 
    <div> 
     <asp:TextBox ID="VerifyPostbackTextBox" runat="server" Text="true" />   
     <asp:Button ID="SubmitFormButton" runat="server" OnClientClick="attack()" Text="Works 90%" OnClick="SubmitFormButton_Click" />   
     <input type="button" id="InputButton" value="Works 100%" onclick="attack()" /> 
    </div> 
    </form> 

    <script type="text/javascript"> 
     function attack() 
     { 
      ScriptServiceMadness.Chewbacca.ShootImperialProbeDroid(true, speak, youvefailedme);    
     } 

     function speak(result) 
     { 
      alert(result);    
     } 

     function youvefailedme(error) 
     { 
      alert(error); 
     } 
    </script> 
</body> 
</html> 

code derrière:

using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 

namespace ScriptServiceMadness 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void SubmitFormButton_Click(object sender, EventArgs e) 
     { 
      VerifyPostbackTextBox.Text = DateTime.Now.Ticks.ToString(); 
     } 
    } 
} 

ScriptService:

using System; 
using System.Data; 
using System.Web; 
using System.Collections; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.ComponentModel; 
using System.Web.Script.Services; 
using System.Threading; 

namespace ScriptServiceMadness 
{ 
    /// <summary> 
    /// Summary description for Chewbacca 
    /// </summary> 
    [ScriptService] 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ToolboxItem(false)] 
    public class Chewbacca : System.Web.Services.WebService 
    { 
     [ScriptMethod] 
     [WebMethod] 
     public string ShootImperialProbeDroid(bool letHanDoIt) 
     { 
      if (letHanDoIt) 
      { 
       return "rrrroooorrrr"; 
      } 
      else 
      { 
       return "rrrraaaarrrr"; 
      } 
     } 
    } 
} 

Une chose d'intérêt ... J'ai supprimé le paramètre bool du SciptMethod en écrivant ce question, et il semble fonctionner à 100% du temps. Cela peut bien sûr être une coïncidence.

Répondre

1

Depuis la méthode de script exécute de manière asynchrone vous ne pouvez pas garantir qu'il sera de retour avant que le formulaire est réaffecté. Les modifications ne vont pas augmenter lorsque vous déployez en ligne et que vos utilisateurs ont une connexion plus lente au service Web. Ce que je peux suggérer est que vous postback manuellement en appelant la routine __doPostBack une fois que vous obtenez la réponse.

0

Vous avez oublié:

using TheForce; 

namespace Luke { 
}