26

ASP.NET 4.0は、Internet Explorer 10によってトリガーされたImageButtonイベントを処理する準備ができていないようです。問題は、IE10が画像のクリック座標をdouble値(10進数)として送信し、ASP.NETがそれらを整数として解析して表示することです。次のタイプのエラー:

System.Web.HttpUnhandledException (0x80004005): 
   Exception of type 'System.Web.HttpUnhandledException' was thrown. 
   ---> System.FormatException: Input string was not in a correct format.

   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Web.UI.WebControls.ImageButton.LoadPostData(String postDataKey, NameValueCollection postCollection)
   at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.members_addtocartlogin_twostep_aspx.ProcessRequest(HttpContext context) in c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\932deaba\63ff7eeb\App_Web_MyPage.aspx.28424a96.oraym_un.0.cs:line 0
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

ぐるぐる回って、互換表示でIE10を実行するように強制することを提案する人もいます。ただし、メタタグを追加して<meta http-equiv="X-UA-Compatible" content="IE=10" />も何も解決されません。<?xml version="1.0" encoding="UTF-8">前に追加<!DOCTYPE>しても機能しません。

解決策はありますか?Javascriptでクリックイベントをキャプチャし、小数をなんとかして削除できますか?

注: Framework 4.5にアップグレードして再コンパイルすると、バグが修正されます。ランタイムバージョンはまだ4.0なので、変更する必要はありません。

4

10 に答える 10

22

Scott Hanselmannによるこのブログエントリで説明されているように、.NETCLR2.0および4.0の修正プログラムがあります。

修正により、ie.browserファイルとfirefox.browserファイルが\Windows\Microsoft.NET\Framework\<version>\Config\Browsers、これらのブラウザー定義の新しいバージョンと将来性のあるバージョンで更新されます。他に影響はありません。

.NET 4

.NET 2.0

または、クライアントベースのjavascriptパッチがあります(元々はバグID:755419のConnectアイテムの回避策として投稿されていました):

$(function () {
    // Patch fractional .x, .y form parameters for IE10.
    if (typeof (Sys) !== 'undefined' && Sys.Browser.agent === Sys.Browser.InternetExplorer && Sys.Browser.version === 10) {
        Sys.WebForms.PageRequestManager.getInstance()._onFormElementActive = function Sys$WebForms$PageRequestManager$_onFormElementActive(element, offsetX, offsetY) {
            if (element.disabled) {
                return;
            }
            this._activeElement = element;
            this._postBackSettings = this._getPostBackSettings(element, element.name);
            if (element.name) {
                var tagName = element.tagName.toUpperCase();
                if (tagName === 'INPUT') {
                    var type = element.type;
                    if (type === 'submit') {
                        this._additionalInput = encodeURIComponent(element.name) + '=' + encodeURIComponent(element.value);
                    }
                    else if (type === 'image') {
                        this._additionalInput = encodeURIComponent(element.name) + '.x=' + Math.floor(offsetX) + '&' + encodeURIComponent(element.name) + '.y=' + Math.floor(offsetY);
                    }
                }
                else if ((tagName === 'BUTTON') && (element.name.length !== 0) && (element.type === 'submit')) {
                    this._additionalInput = encodeURIComponent(element.name) + '=' + encodeURIComponent(element.value);
                }
            }
        };
    }
});
于 2013-01-31T13:28:52.037 に答える
9

.NET Framework 4.5をインストールするだけで、この問題を解決できます。

これにより、アプリケーションプールを.NETFramework4.5に切り替えなくても問題を解決できます。

私の場合、アプリプールは.NETFramework3.5のままにしました。どうやら.NETFramework4.5をインストールすると、他のフレームワークバージョンの一部のファイルが上書きされます。

新しい.NETFrameworkバージョンをインストールするのはとても簡単なので、修正プログラム(私にはうまくいきませんでした)や他の解決策を気にする前に試してみる価値があります。

こちらの回避策のセクションをご覧ください

于 2013-02-28T06:57:48.407 に答える
7

JavaScriptの回避策は次のとおりです。これは既存のメソッドをオーバーライドし、x座標とy座標をフロアしてから、これらの新しい座標を使用して既存のメソッドを呼び出します。

Sys.WebForms.PageRequestManager.getInstance()._origOnFormActiveElement = Sys.WebForms.PageRequestManager.getInstance()._onFormElementActive;
Sys.WebForms.PageRequestManager.getInstance()._onFormElementActive = function(element, offsetX, offsetY){
    if (element.tagName.toUpperCase() === 'INPUT' && element.type === 'image'){
        offsetX = Math.floor(offsetX);
        offsetY = Math.floor(offsetY);
    }
    this._origOnFormActiveElement(element, offsetX, offsetY);
};
于 2013-05-24T14:53:29.403 に答える
3

別の回答に記載されているように、この問題は.NET4.5で修正されています。

.NET 4.5にアップグレードできない場合のために、Microsoftは.NET 4.0(KB2836939)および.NET 3.5(KB2836942およびKB2836943)のこの問題を修正するための更新プログラムをリリースしました。

これらのKB記事で問題がどのように説明されているかを次に示します。

Internet Explorer 10以降を使用して、ASP.NETベースのWebページの更新パネル内にあるImageButtonコントロールをクリックすると、部分的なポストバック操作が失敗します。さらに、サーバー側のクリックイベントは発生しません。

参考までに、以下ImageButton.LoadPostDataをスローする元のコードを示しFormatExceptionます。

protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
    string name = UniqueID;
    string postX = postCollection[name + ".x"];
    string postY = postCollection[name + ".y"];
    if (postX != null && postY != null && postX.Length > 0 && postY.Length > 0) {
        x = Int32.Parse(postX, CultureInfo.InvariantCulture);
        y = Int32.Parse(postY, CultureInfo.InvariantCulture);
        if (Page != null) {
            Page.RegisterRequiresRaiseEvent(this);
        }
    }
    return false;
}

そして、これが修正されたコードです:

protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) { 
    string name = UniqueID;
    string postX = postCollection[name + ".x"];
    string postY = postCollection[name + ".y"];
    if (postX != null && postY != null && postX.Length > 0 && postY.Length > 0) {
        x = (int)ReadPositionFromPost(postX);
        y = (int)ReadPositionFromPost(postY);
        if (Page != null) {
            Page.RegisterRequiresRaiseEvent(this);
        }
    }
    return false;
}

internal static double ReadPositionFromPost(string requestValue) {
    NumberStyles style = NumberStyles.AllowDecimalPoint | NumberStyles.Integer;
    return double.Parse(requestValue, style, CultureInfo.InvariantCulture);
}
于 2013-06-14T15:08:20.807 に答える
0

F12を押して手動でIE9に切り替えると、魅力のように機能します。したがって、私たちのアプローチはcontent = "IE = 9"を使用することでしたが、これはIE10のドキュメントモードを切り替えるだけで、ブラウザモードは切り替えません。これでは不十分なようです。

たぶん誰かがドキュメントモードを切り替える方法についても考えていますか?

ますます一般的になっている別の回避策は、LoadPostDataを上書きすることです。を参照してください。

http://www.codeproject.com/Tips/496162/IE10-and-ImageButtons?display=Mobile http://forums.asp.net/t/1823287.aspx/2/10

個人的には、追加の作業と影響がほとんどないため、content = "IE=9"が最適なソリューションであることがわかりました。

于 2012-11-23T09:43:37.500 に答える
0

実際には、tkrauseによってリストされているものとは異なる問題です。適用方法がわかりませんが、利用可能な修正プログラムがあります。これらを適用する方法を知っている人のための情報はここにあります:

http://support.microsoft.com/kb/2784147

ASP.NETセクションを確認すると、この質問に記載されている正確なエラーがあります。これは私が抱えている正確なエラーと問題です。

Server2003を使用しているためアップデートを入手できないと思います。ASP.NET3.5とVS2008を使用しているため、4.xへのアップグレードは簡単なオプションではありません。

于 2013-01-04T20:10:09.917 に答える
0

最終的にImageButtonをサブクラス化し、処理のために渡される前にデータを修正しました。

using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;

namespace Xception.WebControls
{
    [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal),
    AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal),
    DefaultEvent("Click"),
    ToolboxData("<{0}:ImageButton runat=\"server\"> </{0}:ImageButton>")]
    public class ImageButton : System.Web.UI.WebControls.ImageButton
    {
        protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            NameValueCollection newCollection = new NameValueCollection();

            foreach (string key in postCollection.AllKeys)
            {
                if (key.Equals(this.UniqueID + ".x", StringComparison.InvariantCultureIgnoreCase))
                    newCollection[this.UniqueID + ".x"] = Convert.ToInt32(Convert.ToSingle(postCollection[this.UniqueID + ".x"])).ToString();
                else if (key.Equals(this.UniqueID + ".y", StringComparison.InvariantCultureIgnoreCase))
                    newCollection[this.UniqueID + ".y"] = Convert.ToInt32(Convert.ToSingle(postCollection[this.UniqueID + ".y"])).ToString();
                else
                    newCollection[key] = postCollection[key];
            }

            return base.LoadPostData(postDataKey, newCollection);
        }
    }
}
于 2013-03-21T01:21:42.407 に答える
0

これを各ページまたはマスターページのヘッダーに配置するだけです。

<meta http-equiv="X-UA-Compatible" content="IE=9" />

これにより、IE10はIE9標準ドキュメントモードになり、画像のポストバックを適切に処理できます。

于 2013-04-06T02:48:56.963 に答える
0

私の場合、現在.Netを4.5にアップグレードすることはできず、JavaScriptを使用してバグにパッチを適用したくありませんでした。

私が行った解決策は、ImageButtonをLinkBut​​tonに変換することでした。

これは私のImageButtonでした:

<asp:ImageButton ID="MyButton" runat="server" CausesValidation="false" ToolTip="my tooltip" ImageUrl="../Images/button.gif" OnClick="MyButton_Click" ></asp:ImageButton>

これは私が置き換えたLinkBut​​tonです:

<asp:LinkButton ID="MyButton" runat="server" CausesValidation="false" OnClick="MyButton_Click">
    <asp:Image runat="server" ImageUrl="~/Images/button.gif" alt="my tooltip"/>
</asp:LinkButton>

ユーザーの観点からは、すべて以前と同じように機能しますが、IEでクラッシュすることはありません。

于 2015-05-29T06:59:46.053 に答える
0

<head>この場合、マスターページのセクションの下に次のコード行を追加しました。

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">

これは、指定されたバージョンのIEでページをレンダリングできるため、私たちにとってはうまくいきました。

于 2015-06-24T23:27:20.897 に答える