C# 不同浏览器中LinkButton PageMethod行为不一致

C# 不同浏览器中LinkButton PageMethod行为不一致,c#,javascript,ajax,cross-browser,webmethod,C#,Javascript,Ajax,Cross Browser,Webmethod,我在页面上有一个执行回发的链接按钮,但也有一个onClientClick事件。其思想是在后台根据客户端数据设置一些会话变量(不要问) 我在web方法中设置了一个断点来逐步完成我们的代码,我们所经历的是,根据浏览器的不同,PageMethods可能会返回成功消息、失败消息,或者根本不返回任何消息。此外,无论PageMethods结果如何,web方法可能会被调用,也可能不会被调用 下面是一个方便的结果小图表: Browser页面方法webmethods -------------- ------

我在页面上有一个执行回发的链接按钮,但也有一个
onClientClick
事件。其思想是在后台根据客户端数据设置一些会话变量(不要问)

我在web方法中设置了一个断点来逐步完成我们的代码,我们所经历的是,根据浏览器的不同,PageMethods可能会返回成功消息、失败消息,或者根本不返回任何消息。此外,无论PageMethods结果如何,web方法可能会被调用,也可能不会被调用

下面是一个方便的结果小图表:

Browser页面方法webmethods
--------------   -------------  --------------------
IE 8、9、10成功呼叫成功
Safari 5.1.7故障*从未调用*
Firefox 25.0.1*均未成功调用
成功调用Chrome v31失败
这是四种不同的浏览器和四种不同的结果

我尝试在服务器端和客户端代码中生成链接按钮,效果相同,甚至没有在WebMethod中设置会话变量,结果相同

可使用以下简单代码复制代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script type="text/javascript">

    function doStuff() {
        var a = 'a';
        var b = 'b';

        PageMethods.doStuffWebMethod(a, b, doStuffSuccess, doStuffFail);
    }

    function doStuffSuccess() {
        alert(Success!');
    }
    function doStuffFail() {
        alert(Failure!');
    }

</script>

<html>
    <body style="background-color:#f3f4f6;" >

        <form runat="server" name="mainForm" id="mainForm" action="Test.aspx">

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

            <asp:LinkButton runat="server" CausesValidation="false" OnClientClick="doStuff();">Do stuff!</asp:LinkButton>

        </form>
    </body>
</html>
问题:

为什么我的web方法在Safari中失败,并在其他三种浏览器中给我三种不同的返回消息之一


如何更改此代码以使其在上述浏览器中工作

对web方法的调用失败的原因是 您没有取消
链接按钮的回发。
要取消,必须从OnClientClick事件返回false
回发邮件。下面的代码应该可以修复它:

function doStuff() {
  var a = 'a';
  var b = 'b';

  PageMethods.doStuffWebMethod(a, b, doStuffSuccess, doStuffFail);
  return false; // Cancel postback.
}

function doStuffSuccess() {
  alert('Success!');
}

function doStuffFail() {
  alert('Failure!');
}

<asp:LinkButton ID="mybutton"  runat="server" CausesValidation="false" OnClientClick="return doStuff();">Do stuff!</asp:LinkButton>

但我也希望回发发生,因此我不会返回false。“你是说我想做的事根本不可能吗?”小矮人:不,不是不可能。您可以使用_doPostBack()方法在page方法返回后手动触发回发。我已经扩展了我的答案。谢谢,我会稍微尝试一下,看看结果如何。还有,很抱歉投了反对票,我在智能手机上打错了。@littlebbytables:没问题。我刚刚错过了你问题的后贴部分。是的,这就成功了!我忘记了
\uu doPostBack
(因为我认为我以前从未明确地调用过它)。谢谢你的工作!我认为这是一个体面的,经过研究的问题。。。不知道为什么一个两年前的问题突然被否决;对于那些想报复我的人来说,这一定是我的出气筒问题<代码>*
耸耸肩
*
function doStuff() {
  var a = 'a';
  var b = 'b';

  PageMethods.doStuffWebMethod(a, b, doStuffSuccess, doStuffFail);
  return false; // Cancel postback.
}

function doStuffSuccess() {
  alert('Success!');
}

function doStuffFail() {
  alert('Failure!');
}

<asp:LinkButton ID="mybutton"  runat="server" CausesValidation="false" OnClientClick="return doStuff();">Do stuff!</asp:LinkButton>
function doStuffSuccess() {
  alert('Success!');

  __doPostBack('<%= mybutton.UniqueID %>', '');  // trigger the postback.
}