不同浏览器中的LinkButton PageMethod行为不一致
Inconsistent LinkButton PageMethod behavior in different browsers
我在执行回邮的页面上有一个LinkButton,但也有一个onClientClick
事件。这个想法是从客户端数据在后台设置一些会话变量(不要问)。
我在web方法中设置了一个断点来逐步完成我们的代码,我们所经历的是,根据浏览器的不同,PageMethods可能会返回成功消息、失败消息或根本没有消息。此外,无论PageMethods结果如何,都可能调用或不调用web方法。
这是一个方便的结果小图表:
Browser PageMethods WebMethod
-------------- ------------- --------------------
IE 8, 9, 10 Success Called successfully
Safari 5.1.7 Failure *Never called*
Firefox 25.0.1 *Neither* Called successfully
Chrome v31 Failure Called successfully
这是四种不同的浏览器,四种不同结果。
我尝试在服务器端和客户端代码中生成链接按钮,效果相同,甚至没有在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>
和
protected void Page_Load(object sender, EventArgs e)
{
LinkButton lbAdd = new LinkButton();
lbAdd.Text = "Web method test";
lbAdd.CausesValidation = false;
lbAdd.OnClientClick = "doStuff();";
mainForm.Controls.Add(lbAdd);
}
[WebMethod]
public static void doStuffWebMethod(string a, string b)
{
try
{
//System.Web.HttpContext.Current.Session["a"] = a;
//System.Web.HttpContext.Current.Session["b"] = b;
string x = a + b;
}
catch (Exception ex)
{
//
}
}
问题:
为什么我的web方法在Safari中失败,并在其他三个浏览器中给我三个不同的返回消息之一?
如何更改此代码以使其在上述浏览器中工作?
调用web方法失败的原因是您没有取消回发您的LinkButton
。您必须从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>
有关取消浏览器默认行为(回发)的更复杂的解决方案,请查看以下stackoverflow问答。
对于不同的浏览器,您得到这些不同结果的原因可能是由于浏览器供应商的不同实现。但我对此并不确定。
您还可以通过创建网络协议跟踪来验证这种行为(在Google Chrome浏览器中按F12,然后切换到"网络"选项卡)。
如果您没有从doStuff()方法返回false,则协议:
- 调用页面方法
doStuffWebMethod
。然后您会得到JavaScript消息框。(HTTP POST) - 已请求您的WebForm.aspx。(HTTP POST)
- 然后请求WebResource.axd和ScriptResource.axd。(HTTP GET)
第二。和3。显示回发是在页面方法的请求之后执行的。
在doStuff()方法返回false的情况下的协议:
- 仅调用页面方法
doStuffWebMethod
。(HTTP POST)
第二个跟踪清楚地表明没有执行回发。
如果您希望LinkButton发生回发,则可以在页面方法返回后使用__doPostBack()方法在JavaScript成功处理程序中手动触发回发:
function doStuffSuccess() {
alert('Success!');
__doPostBack('<%= mybutton.UniqueID %>', ''); // trigger the postback.
}
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- Android和JavaScript解析API之间不一致
- Javascript的行为与PHP包含文件不一致
- 对这种与document.domain和CORS相关的不一致行为的解释是什么
- 点击链接行为不一致
- Passport.js`isAuthenticated()`不一致的行为;当它应该是真的时候是假的
- 与显示不一致
- Ext 4.2.1 模型日期解析在浏览器之间不一致
- 通过 Dropbox API 上传时的文件内容不一致
- JavaScript - 对象属性不一致
- Javascript 混淆了 null、instanceof 和 typeof 的语法不一致
- localeCompare 显示使用前导变音字符对单词进行排序时不一致的行为
- SVG 对象部分上的 JQuery click() 不一致
- 使用forEach和.shift()时结果不一致
- Window.open浏览器的高度不一致
- 不同浏览器中的LinkButton PageMethod行为不一致
- 当活动处于后台时,Android WebView不一致
- 使用正则表达式删除标记时,Firefox和Chrome之间存在不一致
- JQuery更改在浏览器之间的行为不一致
- jQuery按索引不一致的值筛选对象