Подтвердить что ты не робот

Asp.Net, DropDownList, AutoPostBack и Google Chrome

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

Chrome, похоже, игнорирует событие SelectedIndexChanged, которому пришлось выполнить запрос asynch.

Кто-нибудь знает простую обходную проблему? Спасибо!

EDIT: дополнительная информация

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

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

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

без заданных триггеров, а у dropdows есть наборы AutoPostBack="true"

ОБНОВЛЕНИЕ: (и перетаскивание)

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

Если у кого-то есть идеи, тем временем....

4b9b3361

Ответ 1

Существует известная несовместимость с Ajax.NET и Chrome и Safari 3.

Небольшие быстрые тесты могут быть обманчивыми, потому что они будут работать нормально с существующей библиотекой Ajax.NET, как есть. Это связано с тем, что ему удается выполнить запрос first 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

Это происходит потому, что 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 script на вашу пользовательскую версию, прочитать это.

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. Итак, я думаю, что что-то другое вызывает эту проблему. Вам нужно будет изолировать причину проблемы с помощью процесса устранения. Начните с чего-то простого, как в этом примере, и работайте над тем, что у вас есть за раз.

Ответ 3

Не рекомендуется использовать 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, объединение на стороне сервера script, локализация и глобализация и т.д.

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

Ответ 4

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

Ответ 5

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

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

uncached exception ReferenceError: evt не определен

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

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