1

asp.net ユーザー コントロール (.ascx) があります。ユーザー コントロールには HTML 隠しフィールドがあります。

<input id="HiddenField1" type="hidden" runat="server" />

ユーザー コントロールが HTML ウィンドウ ポップアップを起動し、ユーザーがポップアップにいくつかの値を入力すると、ポップアップが閉じられた後、文字列値がその非表示フィールドに保存されます。

document.getElementById("HiddenField1").value = windowResult;

最後に、ユーザー コントロールのバックエンド コードは、非表示フィールドから文字列値を取得することでいくつかのタスクを実行します。

string[] nameValuePair = new string[2];
nameValuePair = HiddenField1.Value.Split('%');   

問題は、実行中に document.getElementById("HiddenField1") が失敗することです。Web ページでユーザー コントロールを使用すると、コントロールの ID が になるため[my usercontrol name] + $ + [hidden field name]です。(例えばctrl_TaxonomyTree1$HiddenField1)

ユーザー コントロールは動的に入力されるため、インスタンスの名前を常に把握できるとは限りません。

これを整理する方法はありますか?

4

4 に答える 4

1

使用してからidもうありませんHiddenField1runat=server

document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult;
于 2012-05-04T11:02:55.387 に答える
1

編集

コントロールにコードブロックが含まれているため、Controlsコレクションを変更できません(つまり、<%...%>) これが原因でエラーが発生しています

<head id="head1" runat="server">
  <script>
   document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult; 
  </script>    
</head>

runat = "server"属性をタグに追加すると、ランタイムはそれをHtmlHeadコントロールとして扱います。

編集

コメントで提供したエラーの解決策

ページのヘッドセクションからJavaScriptを削除し、ページの本文に追加して機能させました

チェック:エラーの記事

そうなる

document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult; 

非表示のfiledはサーバー側にあるため、javascriptの値を取得するには、filedのクライアントIDを取得する必要があります。

Asp.net4.0の場合

Asp.net 4.0バージョンを使用している場合は、これを参照してください:ASP.NET4.0クライアントID機能

Control.ClientIDModeプロパティ-ClientIDプロパティの値を生成するために使用されるアルゴリズムを取得または設定します。

AutoID ClientID値は、各親ネーミングコンテナのID値をコントロールのID値と連結することによって生成されます。コントロールの複数のインスタンスがレンダリングされるデータバインディングシナリオでは、増分値がコントロールのID値の前に挿入されます。各セグメントはアンダースコア文字(_)で区切られます。このアルゴリズムは、ASP.NET4より前のバージョンのASP.NETで使用されていました。

静的 ClientID値は、IDプロパティの値に設定されます。コントロールがネーミングコンテナの場合、コントロールは、コントロールに含まれるすべてのコントロールのネーミングコンテナの階層の最上位として使用されます。

予測可能 このアルゴリズムは、データバインドされたコントロールにあるコントロールに使用されます。ClientID値は、親ネーミングコンテナーのClientID値をコントロールのID値と連結することによって生成されます。コントロールが複数の行を生成するデータバインドコントロールである場合、ClientIDRowSuffixプロパティで指定されたデータフィールドの値が最後に追加されます。GridViewコントロールの場合、複数のデータフィールドを指定できます。ClientIDRowSuffixプロパティが空白の場合、データフィールド値の代わりに連続番号が最後に追加されます。この数はゼロから始まり、行ごとに1ずつ増加します。各セグメントはアンダースコア文字(_)で区切られます。

継承 コントロールは、NamingContainerコントロールのClientIDMode設定を継承します。

于 2012-05-04T11:04:09.253 に答える
0

このようにClientIDを使用する必要があります

document.getElementById("<%= HiddenField1.ClientID %>").value = windowResult;

クライアントのIDは、サーバーコントロールが含まれるコンテナーによって異なるため、常にClientIDを使用する必要があります。

于 2012-05-04T11:03:31.140 に答える
0

クライアント ID は runat="server" 属性を持つサーバー コントロール IE にのみ割り当てられるという印象を受けましたが、属性 ClientIdMode="Static" を使用して ClientID を常に指定したものに設定するか、 ClientIDMode="Predictable" は、ClientID をサーバーで生成するが常に同じに設定します

于 2012-05-04T11:04:23.793 に答える