У меня есть LinkButton на странице, которая выполняет обратную связь, но также имеет событие onClientClick
. Идея состоит в том, чтобы установить некоторые переменные сеанса в фоновом режиме из клиентских данных (не спрашивайте).Непоследовательный LinkButton PageMethod поведение в разных браузерах
Я поместил точку перерыва в веб-методе, чтобы выполнить наш код, и то, что мы переживаем, заключается в том, что в зависимости от браузера, PageMethods могут возвращать сообщение об успешном завершении, сообщение об ошибке или нет сообщений на все. Кроме того, веб-метод может быть вызван или не вызван, независимо от результата PageMethods.
Вот маленький удобный график результатов:
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)
{
//
}
}
Вопрос:
Почему мой веб-метод неудачу в Safari, и предоставление мне один из трех разных возвратных сообщений в трех других браузерах?
Как я могу изменить этот код, чтобы заставить его работать в упомянутых браузерах?
Я думал, что это было порядочный, исследуемый вопрос ... не уверен, почему двухлетний вопрос внезапно получает downvotes; должен быть мой вопрос с перфорацией для людей, которые хотят отомстить за меня ... »*' shrug' * ' – LittleBobbyTables