1

これが非現実的であるように思われることは承知していますが、緊急の最終段階のビジネス要件を満たすためにこの WebForms ページをどのように再設計しているのかという理由から、私はこの方法で行うことを本当に好みます。

カスタムユーザーコントロールがあります。onclickこのユーザーコントロールには、さまざまなコントロールとonchangeイベントに接続された関数を含む Javascript ブロックがあります。以前は、コントロールの.VisibleプロパティはTrueだったので、その HTML と Javascript はページにレンダリングされていました。

ここで、コントロールの.Visibleプロパティをに設定falseし、UpdatePanel をラップする必要があります。これを行うと、最初のページの読み込み中にコントロールの HTML がレンダリングされなくなります。コントロールの内容を表示するには、ユーザーはボタンをクリックして、コントロールの.Visibleプロパティを に設定するサーバー側のメソッドを実行する必要がありますtrue。現在は UpdatePanel にあるため、コントロールは一種の Ajaxy の方法でページに表示されます。onclickただし、コントロールにある Javascript にアクセスできないようです。onchange関連する Javascript 関数がundefined.

簡潔にするために複雑すぎて説明できない理由で、私が利用したくないソリューション:

  • JSON/AJAX (この短い時間にあまりにも多くの再構築が必要)
  • CSS display:none/visibility:visible (再構築を最小限に抑えるために、サーバー側の機能を可能な限り保持する必要があります)
  • Javascript を親ページまたは .js ファイルに配置します (これは最後の手段と考えますが、を使用してサーバー コントロールを参照します<#%=ControlId.ClientID %>。Javascript が UserControl 内に含まれておらず、そうしたくない場合は、これを行うことはできません。コントロールをClientIdModeに設定しますstatic。)

.VisibleUpdatePanel が UpdatePanel を使用してコントロールのプロパティを に設定したときに、クライアントがアクセスできるように、UserControl に Javascript を保持する方法を見つけたいと思っていますtrue

4

1 に答える 1

2

これを行う最も簡単な方法は、javascript を大きな文字列としてコード ビハインドに含め、ロード時に登録することです。

        protected void Page_Load(object sender, EventArgs e)
        {
            string javasriptToRegister = @"
  function MyAwesomeJavaScriptFunction() {
     alert( document.getElementById('" + this.txtCatName.ClientID + @"').value );
  }";
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true);
        }

これは決して最もクリーンな方法ではありませんが、うまくいきます。

もう少しきれいにしたい場合は、コントロールを表すシングルトンまたはプロトタイプ化されたオブジェクトのいずれかを含む外部 JavaScript ファイルを含めることができます (ユースケースによって異なります)。次に、上記で行ったように、含まれている小さなスクリプトで、オブジェクト/シングルトンのプロパティをクライアント ID に設定できます。例えば:

Javascript:

function MyControlScriptModel() {
  this.txtCatNameClientId = '';
  this.othercontainedValue = 0;
  this.anothercontainedValue = 0;
}

MyControlScriptModel.prototype.DoSomethingWithCatName = function () {
  alert( document.getElementById( this.txtCatNameClientId ).value );
}

コードビハインド:

        protected void Page_Load(object sender, EventArgs e)
        {
            string javasriptToRegister = string.Format(@"var obj = new MyControlScriptModel();
                                                         obj.txtCatNameClientId = '{0}';", this.txtCatNameClientId);
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true);
        }
于 2012-09-14T17:00:37.930 に答える