11

javascript を使用して別の Web ページをデータ入力用の小さなウィンドウで開いていたアプリケーションを、ModalPopupExtender を使用するように変換しています。

正常に動作しているように見えますが、OK イベントで txtData.Text (モーダル ポップアップのテキスト ボックス) を実行すると、データの前にカンマが付いて返されるため、「Rabbit」と入力すると、「 、うさぎ"。

また、クリックして表示する別の場所で複数回使用し、「Fish」と入力すると、「、Rabbit、、Fish」のようなもので戻ってきます

なぜ、またはこれを止める方法がわかりません...何かアイデアはありますか?

4

15 に答える 15

4

こっちも一緒。なぜそれが起こるのかについての手がかりはありません。パネル内のボタンによって開始されたポストバックごとに、カンマと以前の値がすべてのテキスト フィールドに追加されます。

TextBox.Text セッターにフックすると、破損したデータが postdata コレクションに由来することが明らかになりました。したがって、ポストバックの直前に ModalPopupExtender がデータを破損することを意味します。

PS私はUpdatePanelを使用していませんが、通常のパネルを使用しているため、ボタンに関連付けられたトリガーはありません。

更新: 解決策が見つかりました。

5 月の AjaxToolKit のリリース ( http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27326 )にロールバックすると、問題は解決するようです。

于 2009-11-18T03:44:58.947 に答える
4

この解決策をこの問題のすべての人に共有するだけです。html を使用する代わりに、asp コントロールを使用しないようにしてください。

*<input type="text" id="txtID" runat="server" class="myClass" />*

これは私にとってはうまくいきます。

ありがとう、

于 2013-04-30T10:27:51.590 に答える
3

UpdatePanel内にjQueryダイアログがあるという同様の問題がありました。さまざまなサイトで読むことができるように、問題は DOM ツリー内の重複が原因です。

最後に、非常に簡単な解決策を見つけました。ダイアログを div に割り当て、JavaScript でダイアログを開いたり閉じたりしてから、この小さなコードを実行して重複を削除します。

var count = $(".dialog").length;
for (i = 1; i < count; i++) {
    $(".dialog").first().remove();
}

編集:それほど単純ではないことが判明しました。最終的に、私のコードは次のようになりました。

ドキュメントの準備ができている場合 (および非同期ページ呼び出しも):

function AddDialog() {

    var dlg = $(".dialog").dialog({ autoOpen: false });
    dlg.parent().appendTo($("form:first"));

    var targetSelector = ".myDialog"; // watch out: can't use ID here!

    if (mustOpenDialog) {

        $(targetSelector).last().remove();  //-- remove last copy

        var dlg = $(targetSelector).dialog({ autoOpen: true });

        var count = $(targetSelector).length;
        for (i = 1; i < count; i++) {
            $(targetSelector).last().remove();
        }
    }

    if (mustCloseDialog) {

        $(targetSelector).dialog("close");
        var count = $(targetSelector).length;
        for (i = 1; i < count; i++) {
            $(targetSelector).first().remove();
        }
    }

}

私の完全なコードでは、mustOpenDialog と mustCloseDialog が分離コードで設定されています。

于 2011-01-14T17:58:51.933 に答える
3

また、フォームに同じ名前のコントロールが複数ある場合の標準的な html 動作である可能性があることを示すフォーラムも見つけました。これを念頭に置いて (そして ajax コントロールにバグがあると仮定して) それを回避するようにコーディングした方法は、Page_Load に、各テキスト ボックスに対して次の種類のステートメントを追加することでした。

string[] vals = txtValue.Text.Split(Convert.ToChar(",")); txtValue.Text = vals[vals.Length - 1];//私の最新の値は常に最後の項目にあったようです

フォームの読み込みはボタン イベントの前に発生するため、値を処理するイベントに到達する前にフィールドを整理します。

于 2010-07-01T06:14:25.097 に答える
2

私の答えは Smarty のものと似ていました。マイページはこんな感じ…

<UpdatePanel>
    <GridView>
        <Button> <-- These buttons fire modal popup programmatically.
        <Button>
        <Button>
    </GridView>
    <ModalPopup>
    <HiddenField> <-- Dummy target of modal popup.
</UpdatePanel>

修正はこれに変更することでした...

<UpdatePanel>
    <GridView>
        <Button> <-- These buttons fire modal popup programmatically.
        <Button>
        <Button>
    </GridView>
</UpdatePanel>
<ModalPopup>
<HiddenField> <-- Dummy target of modal popup.

gridview の rowdatabound イベントの scriptmanager を使用して、各ボタンをポストバック コントロールとして登録する必要がありました。欠点は、完全なポストバックが多いことです。しかし、それは問題を解決しました。

于 2010-09-14T01:26:14.947 に答える
2

これはかなり遅い返信ですが、他の人が利益を得ることができるようにここに文書化しています. 私のシナリオ

ボタンのクリック時に jquery ダイアログ内でユーザー コントロールを開きます。このユーザー コントロールには、内部に更新パネルといくつかのテキスト ボックスがありました。初めてダイアログを開くと、魅力的に機能しました。その後クリックしてダイアログを開くと、奇妙な動作に気付きました。ユーザーコントロール内(更新パネル内)にテキストボックスがほとんどありませんでした。部分的なポスト バックでは、テキスト ボックスのテキストが に変更されましたcurrent text, current text。textbox の値が だった場合、fish部分的なポストバック時に に変更されfish, fishます。

この理由は、jquery を使用してダイアログを開いていたためです。また、ボタンのクリック時にフォームにダイアログを追加しました。

 dlg.parent().appendTo($('form:first'));

したがって、後続のクリックで複数のユーザー コントロールが DOM に追加されるため、ポスト バック データの作成中に、同じ ID を持つ複数のコントロールが存在し、「,」を使用して追加された値が存在します - コンマ。

私の解決策は簡単で、ダイアログを閉じるときにDOMから削除しただけです

以下のリンクからヒントを得ました。今後の参考のためにここに投稿 する

于 2012-03-14T08:33:19.477 に答える
2

以前の値がカンマで区切られて返されるという同じ問題がありました。私のOKボタンは更新パネルの中にあるようで、トリガーセクションにもありました。更新パネルのトリガーセクションからボタンを削除すると、問題が解決しました。

よろしく - トバイアス

于 2009-10-29T22:41:22.607 に答える
1

テキストボックスがReadOnlyに設定されていると、何らかの理由で発生しないようです。

編集可能なテキストボックスをユーザーに表示し、キーストロークをキャッチし、ユーザーから隠されている読み取り専用のテキストボックスを更新することで、回避策があると思います。

まだ少し面倒ですが、5 月のリリースにロールバックすることはできません。なぜなら、5 月のリリースには回避する必要がある ComboBox に関する別のバグがあるからです!


アップデート:

少し背景として、モーダル ポップアップ内にユーザー コントロール (ascx) があります。再利用する必要があるからです。ascx はユーザーの入力自体を処理する必要があります (含まれているページはコントロール内で何が起こっているかを知りません)。そのため、ユーザーがボタンをクリックすると、コールバックを実行してデータを処理します。成功した結果がクライアントのコールバック関数に返された場合、実際にはユーザーには表示されない「OK」ボタンであるとページが認識しているクリックをシミュレートします。

コードを変更して、非表示の読み取り専用テキスト ボックスを追加し、テキストが変更されるたびに元のテキスト ボックスから新しいテキスト ボックスにテキストをコピーしました。

    <asp:TextBox runat="server" ID="txtName"></asp:TextBox>

になる

    <asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
    <asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>

次に、txtName の値を取得する代わりにコールバックで値を返すときに、txtNameRO を使用します。

ポストバックを行っている場合、これは役に立たないと思いますが、私のようにポストバックの前にコールバックを追加できます。とにかくこれが誰かを助けることを願っています!

于 2009-11-24T11:00:50.123 に答える
0

Jenの応答に基づいて、完全なハックを正常に実装しました。asp:HiddenFieldを使用して、ポストバックする値を保持し、純粋なHTML入力ボックスを入力します

<asp:HiddenField ID="txt" runat="server"/>
<input type="text" onchange='document.getElementById("<%= txt.ClientID %>").value = this.value;' />

これは、まだ1つのサーバーコントロールのみをポストバックしているため、Jenのソリューションよりも軽量です。

ところで、これはAjaxToolkitの非常に重大なバグです。ここで投票してコメントすることができます:

CodePlexの問題

シカゴにいるふりをします。早く投票し、頻繁に投票してください。

于 2010-02-25T21:48:34.833 に答える
0

同じ問題があり、ここで解決策を見つけました: http://ajaxcontroltoolkit.codeplex.com/workitem/26259

問題は ajax の最後のバージョンです。2009 年の ajax バージョンをインストールするだけで、modalpopup は実際のコードで正常に動作します。

Tuve el mismo problema y encontré la solución en el link que indico arriba. El problema viene con las versiones recientes de ajax, simplemente instala la version del año 2009 y el modalpopup funcionará bien con tu codigo actual.

于 2014-03-13T13:34:50.007 に答える
0

私にとっての解決策は、メインの更新パネルからモーダル ポップアップを取得することでした。それをしたら、カンマは消えました。モーダルポップアップ内に更新パネルが本当に必要な場合は、そのパネル内に独自のパネルを作成してください。
以前のバージョンのツールキットにロールバックする必要はありませんでした。

于 2010-03-17T21:25:33.627 に答える
0

私はこれを1日解決しようとしてきましたが、私のオフィスの非常に親切な人が素晴らしい解決策を思いつきました!

ModalPopUpExtender と、エクステンダーによって制御される後続のポップアップ パネルをページの最も外側の UpdatePanel の外側に移動し、偽のボタンを作成して、偽のボタンの ID を ModalPopUpExtender の TargetControlID プロパティに与えました。

<asp:Button runat="server" ID="dummyButton" CausesValidation="false" Style="display: none" />

<cc1:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="dummyButton" CancelControlID="CancelPopUp" PopupControlID="PanelID" BackgroundCssClass="modalBackground" />

PopUp エクステンダーとパネルがあったフォーム/ページ内で、ModalPopUpExtender をトリガーするために使用していたボタンに OnClick イベントを作成しました。

<asp:ImageButton ID="ButtonID" runat="server" Text="Add" ImageUrl="~/Images/Add-32-1-small.png" OnClick="LoadPopUp" />

ModalPopUpExtender をトリガーするボタンで、"LoadPopUp" という OnClick イベントを作成しました。

protected void LoadPopUp(object sender, EventArgs e)
{
  ModalPopupExtender1.Show();
}
于 2010-04-29T15:45:06.953 に答える