9

コントロールを使用し<asp:Button />ましたが、ブラウザーでレンダリングした後、そのコントロールにclickイベント プロパティが割り当てられていません。サーバーサイドイベントをどの程度正確に呼び出していますか?

ASPX コード:

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClickEvent" />

上記のコントロールは、ブラウザで次のコードとしてレンダリングされました。

<input type="submit" name="Button1" value="Button" id="Button1">

次のコードはブラウザでレンダリングされ、設定されます__EVENTTARGET私の疑問は、メソッドがどのよう__doPostBackに呼び出されるのかということです? 呼び出し方法はどこにありますか?

 function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
4

3 に答える 3

12

簡単な答え: JavaScript 関数は、特定のコントロールそれが処理するイベントに__doPostBack基づいて呼び出されます。<asp />

詳細な回答:場合によります。


まず、あなたの例をカバーしましょう。<asp:Button />標準としてレンダリングされる があります<input type="submit" />ASP.NET WebFormsのすべては、標準のHTML<form>タグを中心に展開します。HTMLは、JavaScript を使用したり支援したりせず<form>に、ボタンをクリックして送信されます。<input type="submit" />

<input type="submit" />これを念頭に置くと、レンダリングされたボタンにイベントが割り当てられていないことがよくわかります (既にお気づきでしょう) 。onclickご覧のとおり、ボタンがクリックされるとフォームが送信されます。

ボタンがクリックされたときにバックエンド (C#/VB.NET/etc.) コードがどのように実行される<input type="submit" />かについては、すべて ASP.NET Framework 自体によって処理され、この質問/回答の範囲を超えています。


__doPostBack第二に、何が何で、どのように使われるかをカバーしましょう。 __doPostBackHTML を送信するために使用される単なるヘルパー JavaScript 関数<form>です。上記の理由により、<input type="submit" />ボタンが関数を呼び出す必要がない理由がわかりました。__doPostBack

<asp:DropDownList />簡単にするために、コントロールがあり、SelectedIndexChangedイベント ハンドラーが割り当てられている ASP.NET ページを見てみましょう。

<asp:DropDownList ID="MyDropDownList" AutoPostBack="true" OnSelectedIndexChanged="MyDropDownList_SelectedIndexChanged" runat="server" />

<asp:DropDownList />次のようにレンダリングされます。

<select id="ctl00_MyDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MyDropDownList\',\'\')', 0)" name="ctl00$MyDropDownList"></select>

setTimeoutイベント内の関数を無視しましょう。onchangeこれは、ASP.NET で使用されるハックな回避策にすぎません。イベント内の関数に注目しましょう__doPostBack

ここでわかるように、__doPostBack関数onchangeイベント ハンドラーによって呼び出されています。<asp:DropDownList />主な違いは、または<select />コントロールの値を変更しても、ブラウザはフォームを送信しないことです!

ここでも、ASP.NET Framework は、フォームが送信されたときにバックエンド コードがどのように実行されるかを内部的に処理します (__doPostBack関数を使用するかどうかに関係なく)。


最後に、 の詳細については、 と の__doPostBackeventTarget2 つのパラメーターを受け入れますeventArgument。ポストバックを引き起こしているコントロールeventTargetのレンダリングされた HTML プロパティを含みます。idandeventArgumentは、追加データをバックエンド コードに渡すために使用できるオプションのパラメーターです。


追加情報の編集: OP は非常に興味深い質問をしました - 複数の送信ボタンがあるとどうなりますか?

操作中POST、ブラウザーには、操作を開始する原因となったvalueの が含まれます。<input type="submit" />

つまり、<input />要素の値を取得するのと同じように、送信の原因となったボタンを照会することもできます!

于 2013-04-01T17:58:03.390 に答える
4

コントロールは送信ボタンで、__dopostback メソッドを呼び出さずにフォームをサーバーに直接送信できます。したがって、この場合 __dopostback は呼び出されません。__dopostback は、ドロップダウン リストのように、既定の送信動作を持たないコントロールに使用されます。

サーバー側イベントへの接続は、コントロールが実装する ipostbackeventhandler インターフェイスを介して行われます。詳細については、http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspxを確認してください。

于 2013-03-30T00:55:10.503 に答える