20
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ASP.NET WebForm JavaScriptでPostBackイベントを発生させる

Last updated at Posted at 2014-04-01

JavaScriptでPostBackイベントを発生させたい、という場合は結構あると思います。

この場合__doPostBack('btnSubmit','')という風にやるのが常道だったのですが、これはいわば隠し関数で天下のマイクロソフトの都合で今後どうなるのかわからないので、オフィシャルには以下のように行います。

function invokeSubmit(){
    <%= Page.ClientScript.GetPostBackEventReference(btnSubmit,String.Empty)  %>
}

で、これでOKかと思いきやそうではなく、このままだと「無効なポストバックまたはコールバック・・」というようなエラーが出ると思います。

これは、想定された場所以外からポストバックが起きているから駄目よ、という余計なお世・・・でなく、セキュアな.NET Frameworkが発生させているありがたい例外になります。PageのEnableEventValidationをfalseにしてしまうという手もあるのですが、それだと脆弱性につながる危険性があるため、以下のようにします。

Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter)

    Page.ClientScript.RegisterForEventValidation(btnSubmit.UniqueID, String.Empty)
    MyBase.Render(writer)

End Sub

Renderイベントで、RegisterForEventValidationを使用し検証対象処理として登録を行っておきます。

これで晴れてセキュアな状態を保ちつつ呼び出しが可能になります。

<参考>
ClientScriptManager.GetPostBackEventReference メソッド (Control, String)
__doPostBack を使ってはいけません
ASP.NET Event Validation and “Invalid Callback Or Postback Argument” : Part II

公式ドキュメントを見る限り、サーバーサイドでonclick属性に設定したりするのに使っているようだ。
その意味では、イベントを発生させるエレメントが決まっているなら公式サンプルどおりAttributes.Add("onclick", cs.GetPostBackEventReference(mycontrol, b.ID.ToString()));というような感じでやるのが良いと思う。

20
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?