4


1

ポストバックでユーザーコントロールイベントハンドラが失われる

私はlinkMiteの箇条書きリストを持っているLeftMenuと呼ばれるメニューusercontrolを持っています。 ascxページにあります。


page_loadのリストを `if(!isPostBack)`の下にデータバインドします

コントロールを読み込むページに問題があります。 ページが最初にロードされると、イベントハンドラが起動します。 しかし、ページをポストバックするとそれが発生しなくなり、IE8では、デバッグしているときに、 "__doPostBack( 'LeftMenu $ PublisherList'、 '0')を指すVisual Studioで" Microsoft JScriptランタイムエラー:オブジェクトが予想されます" FFではエラーにはなりませんが、何も起こりません。 私は動的にコントロールをロードしているのではなく、aspxページにロードしています。

<%@ Register TagPrefix="Standards" TagName="LeftMenu" Src="LeftMenu.ascx" %>

イベントハンドラを紛失した場所についてのアイデア

私はこれが私が持っている別のユーザーコントロールでも起こっていることに気付いたところです。 テキストボックスとボタンと私はデフォルトのボタンを使っているのは確かにEnterキーを押すことでそのボタンが使えるようにするためです。 .NetはHTMLのそれを次のように変換します。


だから私はボックスにキーを入力するとすぐに私は "オブジェクトが期待されている"と言う行にJavaScriptエラーが表示されます。 2つの問題が関連しているようです。

もう一度編集する:明確にする必要があると思う。 メニュー項目をクリックしているのではなく、ポストバックで選択した項目を見つけることができません。 この検索ページの左側にナビゲーションがあり、そのページのメインコンテンツがポストバックの原因となっています。 このポストバックですべて問題ありません。 そのページがポストバックされたら、左側のナビゲーションで箇条書きリストをクリックすると、JavaScriptエラーが発生して失敗します。 LeftMenuコントロールのpage_initは呼び出されません。

6 Answer


0


あなたはPostBackのリストをDataBindingしていないのでクリックを失うかもしれないように聞こえます。 したがって、ポストバックは存在しないコントロール(特定の箇条書き項目)を参照しようとしています。

問題が解決したかどうかを確認するために、PostBackでリストをもう一度バインドしてみてください。 しかし、本当に起こるべきことは、LeftMenuとBulletedListがそれらの情報をViewStateに格納しなければならないということです。そうすれば、最初のページロードでユーザーに表示されたデータがPostBackが処理および処理しているデータと同じになります。 。


0


UserControlとその中のすべてのコントロールに対してEnableViewState = trueが設定されている場合は、すべてうまく機能するはずです。 ViewStateが有効になっていると、Initが起動した後、ASPはViewStateからコントロールを再作成します。 つまり、ポストバックイベントarg(コントロールリスト内のインデックスを指す)は、そのリスト位置にコントロールを見つけます。 それ以外の場合、ポストバック時にリストは空になります。

しかし、ViewStateは悪魔の働きであり、あなたがステートフルな環境で働いているという錯覚を単に助長するように設計されています。 少量のデータに使用しても問題ありませんが、ViewStateで作成されるデータ量がわからないため、リピーターやリストなどのテンプレートコントロールにはお勧めできません。

静的な、または比較的静的なデータを扱う場合は、その都度アプリケーションキャッシュに保存し、Page.Initにリストを再バインドします(post-initはASPがViewStateから再バインドするときなので、Initに含める必要があります)。最初にそこに入ると、あなたのデータが代わりに使用されます。

揮発性データを扱う場合、再バインドするデータは元のページ要求とまったく同じである必要があるため、問題があります。そうしないと、ポストバックイベントが誤った行に対して発生します。 その場合は、初期データをSessionに格納するか、単純に行IDのリストを(隠し変数またはSessionに)格納し、毎回IDからバインドするデータを再作成する必要があります。

さらに良い解決策は、ポストバックイベントをまったく使用しないことです。 すべてのイベントを、クエリ文字列にIDを持つGETに変換してください。 あなたはまだ(あなたが現在行っているように)最初のページを通してバインディングを使ってリストを作成することができます、そしてあなたは新しいIDで同じページをGETすることさえできます。

同じページで状態を維持する必要があるが、ラジオボタンの選択を変更してユーザーに応答する必要がある場合(または他の方法)、Ajax呼び出しを使用して画面を更新することを検討してください。 また、Ajax呼び出しに渡すIDを使ってそれを行います。

一般的に、ステートフルASPを使用することからあなたが動くほど、あなたのページはより明るくより敏感になります。 必要に応じて、ステートレスMVCに移行することもできます。 ViewStateは必要なときには使用できないため、あいまいな問題のデバッグに費やす時間を大幅に節約できます。

私が読んだViewStateの最良の分析は下のリンクにあります。 それがどのように機能するかを十分に理解していれば、必ずしもコストをかけずにそれを使い続けることができます。


0


これはJavaScriptに関連している可能性があり、ページの前の方でロードされているスクリプトがエラーをスローしてページが正しくロードされない原因となっている可能性があります。

あなたのユーザーコントロールは、ページにJavaScriptをロードしていますか? ページの初期ロード時にJavaScriptエラーをチェックできますか?


0


私は自分の持っている既存のプロジェクトにコードを移動しましたが、ある奇妙な理由で私はJavaScriptエラーを受け取るのをやめて代わりに次のようになりました。

msgstr "ポストバックまたはコールバック引数が無効です。 イベント検証は、設定内の ``またはページ内の `<%@ Page EnableEventValidation =" true "%>`を使用して有効にします。

セキュリティ上の理由から、この機能はポストバックイベントまたはコールバックイベントへの引数が元々それらをレンダリングしたサーバーコントロールから発生していることを検証します。 データが有効で期待されるものであれば、ポストバックデータまたはコールバックデータを検証用に登録するために `ClientScriptManager.RegisterForEventValidation`メソッドを使用してください。

ユーザーコントロールを使って登録イベントの検証を行うことになっているところはよくわかっていませんが、その間に 'enableeventvalidation = false’を設定しただけで今はうまくいくようです。


0


doPostBack関数は、引数がリテラルであるため欠落しているように見えます。 それはあなた自身の関数の1つですか、それともASP __doPostBack関数を呼び出すつもりでしたか?

Firefoxのエラーコンソールを見たり、IEでスクリプトのデバッグを許可したり、どのオブジェクトが見つからないのかを確認したりしてください。 さらに良いことには、Firebugをダウンロードしてデバッグしてください。


0


私は同様の問題を抱えていました。 必要ではない設定が適用されていたため、Akamaiはユーザーエージェント文字列を変更していました。

つまり、.NETコントロールの中にはdoPostBackコードを正しくレンダリングしないものがありました。 この問題は http://www.dotnetlite.com/2010/06/21/loss-of-dopostback-code-after-protecting-a-site-with-akamai/[here]ブログされています。