簡體   English   中英

在表單提交時調用ScriptMethod?

[英]Calling a ScriptMethod on form submission?

當我使用OnClientClick屬性從ASP.NET按鈕調用ScriptMethod時,ScriptMethod返回95%的時間(顯示警告框),然后頁面提交。

如果我從HTML輸入按鈕調用該方法,則ScriptMethod會返回100%的時間,但是當然頁面不會提交。 如果我將類型更改為提交,那么我將返回到隨后的95%。

我是否需要更改方法,並在ScriptMethod返回后從javascript調用commit,還是有一種方法可以使這種方法100%的成功? 通過成功,我的意思是實際上在表單提交之前100%的時間都在返回。 ScriptMethod永遠不會真正失敗。

頁:

<%@ 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>

后面的代碼:

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";
            }
        }
    }
}

有趣的一件事...在編寫此問題時,我從SciptMethod中刪除了bool參數,它似乎可以100%地起作用。 當然這可能是巧合。

由於腳本方法是異步執行的,因此您不能保證它會在表單回發之前返回。 在線部署並且用戶與Web服務的連接速度較慢時,更改不會增加。 我可能建議您在收到響應后通過調用__doPostBack例程手動進行回發。

你忘了 :

using TheForce;

namespace Luke {
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM