Asp.Net, DropDownList, AutoPostBack и Google Chrome - PullRequest
12 голосов
/ 04 февраля 2009

У меня есть простая страница 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 ... Я пытаюсь шаг за шагом удалить все остальные элементы исходного проекта, чтобы точно определить, в чем проблема.

Если у кого-то есть идеи ...

Ответы [ 6 ]

15 голосов
/ 10 февраля 2009

Существует известная несовместимость с 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:)

2 голосов
/ 04 февраля 2009

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

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

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

Обновление логики if-then для поиска 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 на вашу пользовательскую версию, прочитайте это .

UPDATE:

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

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

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

0 голосов
/ 19 мая 2009
0 голосов
/ 01 мая 2009

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

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

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

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

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

0 голосов
/ 01 мая 2009

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

0 голосов
/ 12 марта 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, и сейчас вы можете просто добавить ее в свой проект вручную.

...