__doPostBack
関数を使用しようとしているので、ページの読み込み時にページにポストパックを強制できますが、理解するのに問題があります。
オンラインで例を見ていました。ボタンをクリックすると、ポストバックを実行したいのですが、コードビハインドのコードを完成させる方法がわかりません。
これが私がこれまでに持っているものです:
<script type="text/javascript">
function DoPostBack() {
__doPostBack('btnNew', 'MyArgument');
}
</script>
これが私のボタンです
<asp:Button ID="btnNew" runat="server" CausesValidation="False" CommandName="New" OnClick="DoPostBack()" Text="Create" />
コードビハインドで「MyArgument」を使用することを理解していないようです。ページの読み込み時にポストバックするように、コードビハインドで何をする必要がありますか?よろしくお願いします。
シナリオ1
JavaScriptを使用する場合関数を使用してポストバックをトリガーする場合は、OnClick
をOnClientClick
に置き換える必要があります。ボタンの定義を次のように変更します(ボタンはUpdatePanel
内にネストされていると既に想定しています)。
<asp:Button ID="btnNew"
runat="server"
CausesValidation="False"
CommandName="New"
OnClientClick="DoPostBack();"
Text="Create" />
背後のコードで、Page_Load
メソッドで、Request["__EVENTTARGET"]
とRequest["__EVENTARGUMENT"]
を読み取ります。
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
if (Request["__EVENTTARGET"] == "btnNew" &&
Request["__EVENTARGUMENT"] == "MyArgument")
{
//do something
}
}
}
シナリオ2
必ずしもJavaScriptを使用する必要がない場合、ボタンの定義を次のように変更します。
<asp:Button ID="btnNew"
runat="server"
CausesValidation="False"
CommandName="New"
OnClick="DoPostback"
CommandArgument="MyArgument"
Text="Create" />
次に、コードビハインドに次のメソッドを追加します。
protected void DoPostback(object sender, EventArgs e)
{
var target = ((Button)(sender)).ClientID; //"btnNew"
var argument = ((Button)(sender)).CommandArgument; //"MyArgument"
if (target == "btnNew" &&
argument == "MyArgument")
{
//do something
}
}
関数__doPostBack
に引数として渡される値は、__EVENTTARGET
および__EVENTARGUMENT
という名前の要求パラメーターとしてサーバーに送信されます。 ASP.NETはこれらの値を使用して、イベントを発生させたコントロールと、EventArgs
オブジェクトとして渡す必要のある引数を決定します。ただし、オブジェクトHttpRequest
を使用して直接アクセスできます。
string eventTarget = this.Request.Params.Get("__EVENTTARGET");
string eventArgument = this.Request.Params.Get("__EVENTARGUMENT");
ASP.Netは、javascriptからPostBackを実行するための呼び出しを作成する方法を提供します。
ClientScriptManager.GetPostBackEventReferenceメソッドは、特定のコントロールからポストバックを実行するためにJavaScriptで使用する必要のあるコードをビルドします http://msdn.Microsoft.com/en-us/library/system.web.ui.clientscriptmanager .getpostbackeventreference.aspx
以下は例です(VB.Net)。コードビハインドでは、独自のjavascript関数を作成しています。 ASP.Netコードは、関数にjavascriptコードを挿入して、「MyButton」コントロールのポストバックを実行します。ページが作成されると、このjavascript関数が使用可能になります。 javascriptコードがこのjavascript関数を呼び出すと、PostBackが実行されます。これは、[MyButton]ボタンがクリックされたときに発生するアクションを模倣します。
Dim csm As ClientScriptManager = Page.ClientScript
Dim sb As New StringBuilder
sb.AppendLine("function handleDoPostBack() {")
sb.AppendLine(csm.GetPostBackEventReference(MyButton, ""))
sb.AppendLine("}")
csm.RegisterClientScriptBlock(Me.Page.GetType, "js_code__create_functions", sb.ToString, True)
それがあなたが探しているものであることを願っています。
[〜#〜]更新[〜#〜]
これは、サーバー側で作成されたjavascript関数を呼び出す方法の例です。
<input type="button" value="Click Me" onclick="handleDoPostBack();" />
PostBackボタンの概念を混乱させたくなかったので、(ASP.Netボタンを使用する代わりに)通常のHTMLボタンを作成しました。これは単にHTMLボタンであり、プログラムで実行する以外のことは何もしません。 onclickにjavascript関数呼び出しを追加したので、ボタンを押すと、ポストバックが実行されます。このポストバックが発生すると、「MyButton」ボタンがクリックされたかのように動作します。これは、ページのどこかにあるASP.Netボタンになります。そのボタンはASP.Netボタンであるため、すでにPostBackを単独で実行していることになります。そのため、プログラムでPostBackをトリガーしようとしている理由について混乱が生じていると思います。
Javascript関数をコードで直接呼び出すこともできます...
<script>
handleDoPostBack();
</script>
これは、コードが検出するとすぐに発生します。または、onloadイベントに入れると、ページの読み込みが終了したときに呼び出されます。しかし、私のコメントで述べたように、無限のループになってしまう可能性があるため、注意する必要があります。
他の回答のコメントのいくつかを読んだことから、あなたが解決しようとしている問題は、あなたが使用しているAJAXパネルに関係しているようです。私はそれらに精通していません、そのため、なぜそれが機能しないのかわかりません。また、PostBackをプログラムでトリガーすることで問題が解決するかどうかもわかりません。
ただし、プログラムでPostBackをトリガーする必要がある場合は、これが使用できるコードです。ページにボタンを表示したくないが、アクションを実行したい場合に使用します。私のページで何か他のことが起こったとき、ボタンがクリックされたかのように動作するJavaScriptコードを実行します。サーバー側でそのボタンのクリックを処理できます。 ASP.Netページにボタンを含めますが、CSSを使用してユーザーにボタンが表示されないようにします。そのため、ユーザーにはボタンは表示されませんが、私のjavascriptコードは、そのボタンのクリックを模倣するjavacript関数を呼び出すことができます。
以下のコードは、C#を使用してポストバックを実行するために機能します。 'MyArgument'パラメータを使用しておらず、空のままにしていることに注意してください
ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "DoPostBack", "__doPostBack('dummybtnPivotGridupdate', '')", true);
どこ
<asp:Button ID="dummybtnPivotGridupdate" runat="server" Style="display: none;" ClientIDMode="Static" />
お役に立てれば!