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()));
というような感じでやるのが良いと思う。