問題タブ [naming-containers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
data-binding - ASP.NET GridViewのカスタム名前付けコンテナー?
GridViewのアイテムにカスタムネーミングコンテナを実装する方法についての情報を探しています。私の問題は、曜日ごとにセルを持つGridViewがあり、各セルに同じまたは類似のコントロールが含まれることです。同じコントロールの場合は、「lblPersonName」のように、すべて同じ名前を付けると便利です。
ただし、これを行うと、行内に重複するIDを持つコントロールがあると文句を言うため、FindControl()を使用できません。問題の根本は、GridViewのコントロールの名前付けコンテナーがテーブルのセル(DataControlFieldCellなど)ではなく、GridViewRowであるということです。
これを行う方法があるかどうかはわかりませんが、セルが名前付けコンテナーになるようにデフォルトの名前付けコンテナーを交換できると便利です。そうすれば、同じコントロール名を使用できます。
確かに、このためのASPXは少し大きくなり始めています。私は、ASP.NETMVCでプロジェクトを開始したかったのにと思い始めています。
いずれにせよ、このようなコントロールを使用してGridViewを実装する方法に関しては、他の選択肢を受け入れることができます。この時点で、単純な古いテーブルを使用してコントロールを動的に追加する方がクリーンな場合があります...
明確にするために:-各列はItemTemplateで定義され、コントロールはItemTemplate内にあります。-現在それを機能させる唯一の方法は、「lblPersonNameOne」、「lblPersonNameTwo」などを使用することです。
c# - エクステンダーで名前付けコンテナーが「設定」されない
私は原因を知っているかもしれないと思いますが、多くのコードの書き直しなしでそれを修正する方法はわかりません(私は避けたいと思います)。
私は持っています
と
今ここに奇妙な部分があります。_CalendarExtenderは、TargetIDとして_EditControlのIDを見つける際にエラーを出します。ネーミングコンテナの問題のように聞こえたので、調べてみましたが何も見つかりませんでした。それから私はデバッガーで調べました。_EditControlと_ImageButtonはどちらも、this
期待どおりに名前付けコンテナーが設定されていますが、_CalendarExtenderでは名前付けコンテナーがに設定されていnull
ます。
この問題を自分で修正したいのです_CalendarExtender.NamingContainer=this;
が、これは読み取り専用のプロパティです。
これが発生している可能性があることを私が理解できる唯一の理由は、_CalendarExtenderがExtenderControl->Controlから継承しているためです。PanelがWebControl->Controlから継承する場所。
誰かが私が見逃している可能性のあるもの、またはこの問題の回避策などを知っていますか?
c# - ビューステート/名前空間の競合の解決
リストボックスコントロールがあります。ユーザーがクリックすると、特定のIDを使用するようにカスタムコントロールに指示します。
カスタムコントロールは毎回(動的に)同じものを描画し、このIDに応じて異なるコンテンツをロードするだけです(データベースからコントロールのような動的な形式にロードされます)。
さて、ビューステートの流出に問題があります。リストボックスをクリックしてID#1を読み込むと、すべて見栄えがします。次に、ID#2をクリックすると、カスタムコントロール内に作成されたすべてのテキストボックスコントロールは、ID#1に配置されたものと同じものになります。したがって、リストボックスインデックスが変更された場合、ビューステートをクリアする必要がありますが、これを機能させることはできません。
すべてのコントロールはPage_Loadでも作成されます。
Page_LoadでViewState.Clear()を試しましたが、何もしませんでした。
カスタムコントロールをINamingInterfaceから派生させましたが、IDはまだビューステートと一致していると思います。
カスタムコントロールIDを一意のもの( "CONROL _" + id.ToString()など)に変更してみました。カスタムコントロールを含むパネルでも同じことを試しました。
私はこのビューステートを取り除くことができないようです!
編集OKここに問題を示すコードがあります
マークアップ:
このコードを実行すると、テキストボックスの内容を変更してからドロップダウンリストを変更すると、前に入力した内容が上書きされるのではなく、そこに保持されることに気付くでしょう。
これに関する私の基本的な目標は、ID#2に変更したときに、テキストボックスに「ID#2」が何があっても(できればビューステートを完全に無効にせずに)配置するようにすることです。
asp.net - ASP.NETDataSourceControlに「ネーミングコンテナがありません」という例外があります
私は自分のコードでこの例外を受け取っていて、誰かが私を助けてくれるかどうか疑問に思いました。
ObjectDataSourceにバインドされたリピーターコントロールがあり、リピーターのitemtemplateにはユーザーコントロール(ASCX)が含まれています。このユーザーコントロールには、他のいくつかのコントロール、主にObjectDataSourceに関連付けられているGridViewが含まれています。
この設定でコントロールを最初に使用すると、すべてがうまく機能します。データは正しく表示されます。ただし、フィルターオプション(リピーターの外側のドロップダウン)を変更してからリピーターを再バインドすると、例外が発生します。
ObjectDataSourceコントロール'expDataSource'には名前付けコンテナーがありません。DataBindを呼び出す前に、コントロールがページに追加されていることを確認してください。 "at System.Web.UI.WebControls.DataBoundControlHelper.FindControl(Control control、String controlID)... ...atSystem.Web.UI.WebControls.ObjectDataSource。 LoadCompleteEventHandler(オブジェクト送信者、EventArgs e)
問題が何であるかはわかりません-データソースをASCXコントロールの外に移動すると役立つ可能性があることをいくつかの場所で読んだことがあります-これは何もしません。objectdatasourceは適切に構造化されているように見え、私が言ったように、それは初めて(のみ)機能します。
LoadComplete()が発生した後にASP.NETがFindControl()を呼び出しているときにこれが発生しているという例外について、スタックトレースで気づきました。コードをステップスルーすると、これが発生する前にすべてのコードの実行が終了したように見えるため、すべて「システム」コードになります。
ASP.NETがLoadCompleteハンドラーでこのデータソースコントロールを見つけられないのはなぜですか?
ありがとう!
その他の注意事項:
このエラーは1回おきに発生します。したがって、最初にデータが正しく読み込まれると、2回目の更新でこのエラーが発生して失敗します。もう一度「ロード」をクリックすると、動作します(3回目)。
失敗したときは、ASCXコントロールで「Page_Load」が2回呼び出されているようです。したがって、パターンは次のとおりです。
- 作業パターン:
- 親ページのPage_Load
- ASCXでのPage_Load
データは正常に読み込まれます
- 失敗パターン:
- 親ページのPage_Load
- ASCXでのPage_Load
- ASCXでのPage_Load
- 例外
これはすべて「Repeater.DataBind()」の呼び出しから発生しますが、すでにバインドされているかどうかによって(明らかに)動作が異なります。
その他の注意事項:
本当に奇妙な行動。ObjectDataSourceの下部からSelectParametersのリストを削除しましたが、突然、ページはObjectDataSourceをNamingContainerがないものとして拒否しません。もちろん、これらのパラメーターがないと、データバインディングは実際には機能しません...コードにそれらを追加できますが、なぜそれが重要なのでしょうか?
jsf - Jsf ネーミング コンテナの作成方法
JSF アプリで ID が重複しているという問題があります。この投稿で、考えられる解決策の 1 つは、ネーミング コンテナーを使用することだと読みました。重複した ID の問題を回避するためにネーミング コンテナを使用する方法の例を教えてください。フェイスレットを使用しています。
jsf-2 - JSTL、composite、NamingContainer、およびprependId
複合コンポーネントを作成しましたが、予約済みのEL#{component.clientId}
を使用してJQueryバインドを作成したいと思います。この取得したclientIdをページ内の別の場所(コンポーネント外)で使用するには、JSTLを使用してビュースコープ変数に格納します。奇妙なことに、JSTLは、子の前にIDを追加するという自然な複合コンポーネントの動作(NamingContainer
動作)を妨げているようです。ui:repeat
JSTLは少しトリッキーで、ライフサイクルの問題のために他のコンポーネント(たとえば)に干渉することは知っていますが、ここではこの動作を理解していません。
いくつかの具体的なコードは、この長いスピーチよりも優れています。
コメントされた行で、の#{component.clientId}
ようなものを与えますj_idt261:mySoLovedDataTable
。
コメントアウトされた行で、それはちょうどを与えますmySoLovedDataTable
。
ajax - prependId="false" の UIForm が壊れる
UIForm
属性のみを取得したという事実の背後にある考え方について質問がありますprependId
。NamingContainer
インターフェイスで属性が指定されていないのはなぜですか? おそらく下位互換性のためだと言うでしょうが、互換性を壊して、そのインターフェースを実装するユーザーに、prependId のメソッドも実装させることをお勧めします。
コンポーネントの prependId に関する私の観点からの主な問題は、UIForm
それが壊れるfindComponent()
ということです.prependId
NamingContainer
簡単な例を次に示します。
panelGroup コンポーネントを取得したいときは、文字列"group"
を methodに渡すことを期待しますfindComponent()
が、何も見つからないため、"test:group"
代わりに使用する必要があります。
それに関する具体的な問題は、 ajax を で使用する場合prependId="false"
です。ajax タグは、属性の更新とプロセスで、値がコンテナーの名前付けを処理することを期待しています。それを使用するときに完全なIDまたはパスを指定する必要があるのは少し奇妙ですprependId="false"
が、大丈夫です。
このコードは問題なくレンダリングされますが、panelGroup が見つからないため更新されません。renderIds の要素としてidPartialViewContext
のみが含まれます。"group"
これが予想されるかどうかはわかりませんが、おそらくそうですが、コードはわかりません。findComponent()
パラメーターとして渡された式が"group"
、メソッドがコンポーネントを見つけることを期待する場所であるため、メソッドがコンポーネントを見つけることができないところまで来ました"test:group"
。
findComponent()
1 つの解決策は、この問題に対処するために私が選択した方法を自分で作成することです。このメソッドではNamingContainer
、通常のようにプロパティ prependId が false に設定されているコンポーネントを処理しますUIComponent
。UIComponent
prependId 属性を提供するすべてに対してそれを行う必要がありますが、それは悪いことです。リフレクションは、型の静的な定義を回避するのに役立ちますが、それでも本当にきれいな解決策ではありません。
もう 1 つの方法は、インターフェイスに prependId 属性を導入し、上記のように動作するようNamingContainer
に の動作を変更することです。findComponent()
findComponent()
最後に提案された解決策は、ajax タグの動作を変更して ID 全体を渡すことですが、これは ajax の問題のみを解決し、実装の背後にあるプログラムの問題は解決しません。
それについてどう思いますか、なぜそのように実装されているのですか? この問題が発生したのは私が初めてではありませんが、関連するトピックを見つけることができませんでした?!
jsf-2 - ネーミング コンテナ内のコンポーネントの実際の ID を取得するためのより良い方法
私は次のシナリオを得ました:私はいくつかのタブを取得しました (TabView は名前付けコンテナーです)。そのうちの 1 つで、ダイアログを表示する ap:inputText を取得しました (これは他の xhtml ファイルにあります)。 :inputText 、問題は p:inputText の id が不明であることです (JSF はそれにいくつかのプレフィックスを追加します)
ダイアログでこの update="hoursReportFrm:comment4Dialog" を使用できません
ATM i は、このサイトJSF の例を見ました: コンポーネント ID の操作 (id vs clientId) (2009 年から)
binding="#{lookup.components.comment4Dialog}"
このように、および p:commandButton に変更したダイアログの inputtext にバインディングを追加しましたupdate="#{lookup.clientIds.comment4Dialog}"
そしてそれはうまく動作しますが、後でアクセスしたいすべてのコンポーネントをバインドする必要なしに、より良い方法を探しています...
よろしくお願いします。
jsf - NamingContainer ではない複合コンポーネントを作成する方法
プロジェクトでプライムフェイスポップアップを置き換える複合コンポーネントを作成しました。生成された html で本当に悪いものを見つけました。奇妙な ID が表示され、この ID がどこから始まっているのかを見つけることができないため、この ID は複合コンポーネントによって生成されていると思われます。必要なコンテンツだけを更新するには、この ID を削除する必要があります...この ID を生成するこのコンポーネントを無効にする方法はありますか??
説明のために:
jsf-2 - レンダリング/更新属性のテンプレートで親ネーミングコンテナのIDを取得します
テンプレートがあり、その定義でいくつかのフォームとボタンを使用しています。
問題は、定義(define)xhtmlファイルがコンポーネント階層を認識していないことです。
たとえば、同じ定義ファイル内の別の形式で要素「table2」を更新したいとします。
テンプレート挿入:
私の階層「nav」の最初のレベルを定義します
テンプレート定義:
私の定義部分では、「nav」を知りたくありません!
これどうやってするの?または、1つの名前付けコンポーネントを上に移動するにはどうすればよいですか?または、親の完全なIDの最上位を変数に保存するにはどうすればよいですか?
時々私は次のようなものを見ました:
しかし、これに関する情報は見つかりませんでしたか?、JavaEE6のドキュメントには@キーワードが記載されています。