Asp.Net, DropDownList, AutoPostBack и Google Chrome

У меня есть простая страница asp.net (framework 3.5) и UpdatePanel с серией выпадающих списков, которые я хочу заполнить асинхронно. Все отлично работает во всех основных браузерах (Opera, Safari, IE6, IE7, FF3), но не в Chrome.

Кажется, что Chrome игнорирует событие SelectedIndexChanged, которое должно было выполнить асинхронный запрос.

Кто-нибудь знает простой способ обхода этого? Спасибо!

РЕДАКТИРОВАТЬ: дополнительная информация

Как я сказал Адаму Лассеку, панель обновлений обновляется после нажатия кнопки asp: внутри нее, но она не работает с раскрывающимся событием SelectedIndexChanged.

Панель обновлений настроена следующим образом:

<asp:UpdatePanel ID="updPanel" runat="server" UpdateMode="Always" ChildrenAsTriggers="true">

без триггеров, а в раскрывающихся списках есть наборы AutoPostBack="true"

ОБНОВЛЕНИЕ: (и изменение тегов)

После нескольких попыток я обнаружил, что это не проблема UpdatePanel, но кажется, что AutoPostback раскрывающихся списков не работает должным образом, даже на страницах без ScriptManager и UpdatePanel ... Я уверен, что это проблема касается только этого проекта, потому что, если я начну новый веб-сайт с нуля и воспроизведу его структуру, он отлично работает в Chrome ... Я пытаюсь шаг за шагом удалить все другие вещи в исходном проекте, чтобы точно определить, что проблема.

А пока у кого-то есть идеи ....


person tanathos    schedule 03.02.2009    source источник


Ответы (6)


Известна несовместимость с Ajax.NET, Chrome и Safari 3.

Небольшие быстрые тесты могут быть обманчивыми, потому что будет казаться, что они нормально работают с существующей библиотекой Ajax.NET как есть. Это связано с тем, что ему удается выполнить первый запрос Ajax и терпит неудачу, когда он заканчивается, поэтому только при попытке выполнить второе действие Ajax вы заметите, что оно не удалось. Если вы разместите элемент управления UpdateProgress на своей странице, вы заметите, что после первого запроса элемент управления UpdateProgress не исчезнет.

К счастью, ответ есть!

Недавно был опубликован отличный пост с подробностями о том, что делать, и который вы можете найти здесь:

http://blog.turlov.com/2009/01/aspnet-ajax-compatibility-patch-for.html

Общая суть в том, что и Chrome, и Safari 3 сообщают о себе как WebKit в своих строках userAgent.

Вам нужно добавить немного javascript, чтобы помочь платформе Ajax.NET распознавать браузеры на основе WebKit, которые выглядят следующим образом:

if (typeof(Sys.Browser.WebKit) == "undefined") {
    Sys.Browser.WebKit = {};
}

if (navigator.userAgent.indexOf("WebKit/") > -1 ) {
    Sys.Browser.agent = Sys.Browser.WebKit;
    Sys.Browser.version = 
        parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
    Sys.Browser.name = "WebKit";
}

Вам нужно добавить это в файл javascript и сослаться на него в ScriptManager:

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/assets/javascript/WebKit.js" />
    </Scripts>
</asp:ScriptManager>

Обратите внимание, что вы можете сохранить WebKit.js в сборке и ссылаться на него с помощью тега ScriptReference, подобного этому:

<asp:ScriptReference Assembly="Scripts" Name="Scripts.webkit.js" />

Как только вы это сделаете, по возможности прекратите использование WebForms и Ajax.NET и используйте MVC и jQuery :)

person joshcomley    schedule 10.02.2009
comment
Спасибо! Это решило мою проблему с разбивкой на страницы GridView внутри UpdatePanel в Chrome. - person Ole Lynge; 29.05.2009
comment
По возможности прекратите использование WebForms и Ajax.NET и используйте MVC и jQuery. Мудрый совет, а пока это исправление прекрасно работает. Спасибо, добрый сэр. - person Bayard Randel; 19.08.2009
comment
Я попробовал это, скомпилировав скрипт в свою сборку, и подтвердил, что он выполняется, добавив очень раздражающее предупреждение ('') во втором блоке if. Но после загрузки страницы я проверяю агент и имя браузера, и он установлен на Chrome. Кажется, что скрипт должен быть запущен слишком рано, а его изменения перезаписаны обратно в Chrome? Я использую это с UserControl, загруженным на сайт SharePoint 2007. Есть мысли по этому поводу? - person xr280xr; 13.10.2011

Это происходит потому, что MicrosoftAjax.js обнаруживает браузер и неправильно определяет Chrome как Safari. Чтобы исправить это, вам необходимо внести следующие изменения:

Добавить новый тип браузера

Sys.Browser = {};
Sys.Browser.InternetExplorer = {};
Sys.Browser.Firefox = {};
Sys.Browser.Safari = {};
Sys.Browser.Opera = {};
Sys.Browser.Chrome = {};

Обновите логику "если-то" для поиска Chrome

else if (navigator.userAgent.indexOf(' Firefox/') > -1) {
    Sys.Browser.agent = Sys.Browser.Firefox;
    Sys.Browser.version = parseFloat(navigator.userAgent.match(/ Firefox\/(\d+\.\d+)/)[1]);
    Sys.Browser.name = 'Firefox';
    Sys.Browser.hasDebuggerStatement = true;
}

else if (navigator.userAgent.indexOf(' Chrome/') > -1) {
    Sys.Browser.agent = Sys.Browser.Chrome;
    Sys.Browser.version = parseFloat(navigator.userAgent.match(/ Chrome\/(\d+\.\d+)/)[1]);
    Sys.Browser.name = 'Chrome';
    Sys.Browser.hasDebuggerStatement = true;
}
else if (navigator.userAgent.indexOf(' AppleWebKit/') > -1) {
    Sys.Browser.agent = Sys.Browser.Safari;
    Sys.Browser.version = parseFloat(navigator.userAgent.match(/ AppleWebKit\/(\d+(\.\d+)?)/)[1]);
    Sys.Browser.name = 'Safari';

Обязательно поставьте галочку Chrome перед Safari. Если вам нужна помощь в замене сценария Framework вашей собственной версией, прочтите это.

ОБНОВЛЕНИЕ:

Я создал тестовую страницу и разместил на ней следующие элементы управления:

<asp:ScriptManager ID="scriptManager1" runat="server" />
<asp:UpdatePanel ID="panel1" runat="server" ChildrenAsTriggers="true">
  <ContentTemplate>
    <asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="true">
      <asp:ListItem Value="0" Text="Item 1" />
      <asp:ListItem Value="1" Text="Item 2" />
    </asp:DropDownList>
    <asp:Literal ID="litTest" runat="server" />
  </ContentTemplate>
</asp:UpdatePanel>

И написал следующий код:

protected override void OnInit(EventArgs e)
{
    ddlTest.SelectedIndexChanged += new EventHandler(ddlTest_SelectedIndexChanged);
    base.OnInit(e);
}

void ddlTest_SelectedIndexChanged(object sender, EventArgs e)
{
    litTest.Text = "Selected: " + ddlTest.SelectedItem.Text;
}

Панель обновлений отлично работает в Chrome без каких-либо изменений библиотеки Ajax. Итак, я думаю, что что-то еще вызывает эту проблему. Вам нужно будет изолировать причину проблемы с помощью процесса устранения. Начните с чего-нибудь простого, как этот пример, и постепенно переходите к тому, что у вас есть.

person Adam Lassek    schedule 04.02.2009
comment
Я пробовал ваше предложение (и спасибо за ваш ответ), но, похоже, ничего не меняет ... Я вижу, что если я вставлю кнопку asp: в панель обновления (для которой ChildrenAsTrigger установлено значение true), она будет работать нормально. .но это не работает с SelectedIndexChanged в DropDown (конечно, только в Chrome). - person tanathos; 04.02.2009

Не рекомендуется использовать MVC и jQuery вместо WebForms и ASP.NET AJAX. Нужно понимать все плюсы и минусы технологий и подходов, из которых нужно выбирать.

Во-первых, MVC - это шаблон проектирования, не имеющий ничего общего с упомянутыми выше фреймворками. Вы можете легко реализовать шаблон MVC с помощью WebFroms. Существует множество различных реализаций MVC для ASP.NET и WebForms.

Во-вторых, jQuery, являясь отличной библиотекой JavaScript, не допускает никакой интеграции и не использует функциональные возможности ASP.NET на стороне сервера, в отличие от платформы ASP.NET AJAX, которая входит в стандартную комплектацию ASP.NET 3.5+ и полностью использует ASP. NET, такие как разметка на стороне сервера, элемент управления ScriptManager, объединение сценариев на стороне сервера, локализация и глобализация и т. Д.

В-третьих, jQuery можно легко использовать в сочетании с фреймворками ASP.NET и ASP.NET AJAX, тем самым улучшая программирование на стороне клиента. Microsoft объявила, что jQuery будет поставляться со следующим ASP.NET 4.0, и пока вы можете просто добавить его в свой проект вручную.

person Community    schedule 12.03.2009

Сегодня я столкнулся с похожей проблемой (хотя я не использовал Ajax) и нашел решение. См. Третий комментарий к это сообщение в блоге.

person Jonathan Schuster    schedule 30.04.2009

У меня точно такая же проблема. У меня есть раскрывающийся список внутри обратной передачи ajax, и мне нужно выполнить обновление при изменении выбранного индекса. Он также работает с базовой страницей в новом проекте.

После добавления сценария Webkit, упомянутого в других ответах, у меня все еще возникает та же проблема, и при запуске отладчика javascript в Chrome я получаю эту ошибку:

неперехваченное исключение ReferenceError: evt не определен

ОБНОВЛЕНИЕ: РЕШЕНИЕ

Я обнаружил, что в моем случае это был CustomValidator, который мешал обработчику событий. Установка для EnableClientScript значения false устранила проблему.

person Jonathan Parker    schedule 01.05.2009

Вы можете проверить решение

http://dotnetguts.blogspot.com/2009/05/dropdownlist-autopostback-problem-with.html

person Community    schedule 19.05.2009