2009-07-04 24 views
2

ステージ/テスト環境でうまく動作するWebアプリケーションがありますが、私たちがプロダクション環境に移動すると変なことが起こります。すべてのコントロールIDが変更されます。たとえば、ラベルはctl00_cphMainContent_lblPetNameから_ctl0_cphMainContent_lblPetNameになりました。なぜこれが起こるのだろうか?このようなことが起こる原因は何か。私が知っている唯一の2つの違いは、プロダクション環境にHTTPSがあり、デバッグを無効にしていることです。コントロールIDのレンダリング環境が異なる

+0

これは、vb.netやjavascriptと関係していません。このタグを削除してください。 –

答えて

1

あなたのweb.configは異なります。クライアントID生成の動作は、EnableLegacyRenderingによって異なります。 web.configのxhtmlConformance要素を確認してください。レガシーなら "_ctl"、そうでなければ "ctl"を得ます。

+0

ありがとう、これはまさに問題の原因でした。ルートweb.configにはこれがレガシーに設定されていましたが、これはサブフォルダにあるアプリケーションによって継承されました。 –

4

クライアントIDの生成方法は、異なるバージョンのフレームワーク間で変更される可能性があるため、特定のパターンに頼るべきではありません。

ClientIDUniqueIDのプロパティを使用して、HTMLコードに対して生成されるIDと名前を判別する必要があります。

プロパティClientIDには、生成されたIDが含まれています。たとえば、JavaScriptのdocument.getElementByIdメソッドで使用できます。

UniqueIDプロパティには生成された名前が含まれています。たとえば、Request.Formコレクションのフォームで値を読み取った場合に使用できます。

+0

この変更は1.1から2.0の間であり、おそらく4.0になります。私は環境がそんなに違っているとは思わない... –

+0

2.0以降、フレームワークのすべてのバージョンが増分であるため、この特定の動作が4.0で変更されるとは思わない。 –

0

このトリックは、コントロールIDを知っているサーバーにクライアント側のJavaScriptを送信することです。

var btn1 = document.getElementById(" <%= button1.ClientID %>"); 

、実際には、実行時に、あなたはJavaScriptのすべてを書いているように私はいつも、これを嫌ってきた:

これを行うための通常の方法は、このようなものです。代わりに、私が好きなのは、ページ(またはコントロール)が必要とするすべてのコントロールID(または他のサーバー側の値)を含むクラスを生成することです。

私は例を掲載したいと思いますが、これはしばらくはやっていませんし、私にはありません。基本的に、必要なすべてのコントロールIDのメンバーを含むJavaScriptクラスを作成し、それをページに登録します。 ;

VAR BTN1 =のdocument.getElementById(myPage_Instance.btn1):

myPage_Instance.btn1 = <%= button1.ClientID %>; // Better - do it in the codebehind 
// more of the same 

あなたのコードが今することができ:そして、このような何かを起動スクリプトを登録

関連する問題