12

私は単純なasp.netページ(フレームワーク3.5)と、非同期に入力したい一連のドロップダウンリストを含むUpdatePanelを持っています。すべての主要なブラウザ (Opera、Safari、IE6、IE7、FF3) では問題なく動作しますが、Chrome では動作しません。

Chrome は、非同期リクエストを行わなければならなかった SelectedIndexChanged イベントを無視しているようです。

これに対する簡単な回避策を知っている人はいますか?ありがとう!

編集: 詳細情報

Adam Lassek に言ったように、updatepanel はその中の asp:Button をクリックすると更新されますが、ドロップダウンのSelectedIndexChangedイベントでは機能しません。

updatepanel は次のように設定されています。

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

トリガーが指定されておらず、ドロップダウンにはセットがありますAutoPostBack="true"

更新: (および再タグ付け)

何度か試してみたところ、UpdatePanel の問題ではないことがわかりましたが、ScriptManager と UpdatePanel のないページでも、ドロップダウンの AutoPostback が正しく機能しないようです...問題だと確信しています。このプロジェクトのみに関して、新しいWebサイトをゼロから開始してこの構造を複製すると、Chromeで正常に動作するためです...元のプロジェクトの他のすべてのものを段階的に削除して、正確に何があるかを見つけようとしています問題。

誰かがその間にいくつかのアイデアを持っているなら....

4

6 に答える 6

15

Ajax.NETおよびChrome & Safari 3との既知の非互換性があります。

小規模で簡単なテストは、既存の Ajax.NET ライブラリをそのまま使用して問題なく動作するように見えるため、誤解を招く可能性があります。これは、最初のAjax リクエストを実行し、それが終了すると失敗するためです。そのため、 2 番目のAjax アクションを実行しようとして初めて、失敗したことがわかります。ページにUpdateProgressコントロールを配置すると、最初のリクエストの後、UpdateProgressコントロールが消えないことがわかります。

幸いなことに、答えがあります!

最近、ここで何をすべきかを詳しく説明した素晴らしい投稿がありました。

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

その一般的な要点は、Chrome と Safari 3 の両方が、userAgent 文字列で自分自身をWebKitとして報告することです。

次のような WebKit ベースのブラウザーを Ajax.NET フレームワークが認識できるように、JavaScript を少し追加する必要があります。

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 を使用してください :)

于 2009-02-10T11:48:47.233 に答える
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';

Safari の前に Chrome のチェックを入れてください。フレームワーク スクリプトをカスタム バージョンに置き換える方法についてサポートが必要な場合は、この をお読みください。

アップデート:

テスト ページを作成し、次のコントロールを配置しました。

<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 ライブラリを変更する必要はありません。だから、私は何か他のものがこの問題を引き起こしていると思います。排除のプロセスを通じて、問題の原因を特定する必要があります。この例のような単純なものから始めて、一度にできることまで作業を進めてください。

于 2009-02-04T00:04:46.747 に答える
0

私も同じ問題を抱えてる。ajax ポストバック内にドロップダウンがあり、選択したインデックスが変更されたときに更新を行う必要があります。新しいプロジェクトの基本ページでも機能します。

他の回答に記載されている Webkit スクリプトを追加した後も同じ問題が発生し、Chrome で JavaScript デバッガーを実行すると、次のエラーが発生します。

キャッチされない例外 ReferenceError: evt が定義されていません

更新: 解決策

私の場合、イベント ハンドラーに干渉していたのは CustomValidator であることがわかりました。EnableClientScript を false に設定すると、問題が修正されました。

于 2009-05-01T02:06:09.013 に答える
0

解決策を確認できます

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

于 2009-05-19T03:55:18.087 に答える
0

WebForms と ASP.NET AJAX の代わりに MVC と jQuery を使用することは適切な提案ではありません。選択するテクノロジーとアプローチの長所と短所をすべて理解する必要があります。

まず、MVC は設計パターンであり、言及されている特定のフレームワークとは何の関係もありません。WebFroms を使用して MVC パターンを簡単に実装できます。ASP.NET および WebForms 用の MVC には、さまざまな実装があります。

第 2 に、jQuery は優れた JavaScript ライブラリであり、ASP.NET 3.5+ に標準で付属し、ASP を完全に利用する ASP.NET AJAX フレームワークとは対照的に、サーバー側の ASP.NET 機能との統合を許可せず、活用しません。サーバー側マークアップ、ScriptManager コントロール、サーバー側スクリプト結合、ローカリゼーションとグローバリゼーションなどの NET 機能。

第 3 に、jQuery は ASP.NET および ASP.NET AJAX フレームワークと組み合わせて簡単に使用できるため、クライアント側のプログラミングが強化されます。Microsoft は、jQuery が次の ASP.NET 4.0 に同梱されることを発表しました。今のところ、プロジェクトに手動で追加するだけです。

于 2009-03-12T18:04:04.717 に答える