0

背景のビット:

Umbraco のカスタム データ型に取り組んでいます。データ型は、特定のタイプのノードのリストを表示し、ユーザーがこのリストから選択できるようにします。リストしたいノードのタイプごとに個別のデータ タイプを作成する必要がないように、このデータ タイプを再利用できるようにしました。このデータ タイプのプロパティを作成し、表示するノードのタイプを設定するだけです。

データ型は、チェックボックスのリスト (選択するノードごと) と、これらのノードを選択に追加/選択から削除するボタンを含む UpdatePanel です。

例として、投稿がある場合、このデータ型を追加してカテゴリをリストするように設定できます。これにより、投稿をカテゴリのリストに関連付けることができます。次に、このデータ型の別のインスタンスが必要な場合、たとえば Authors を選択すると、問題が発生し始めます。

DataType 構造情報

これにより、このコントロールがどのように構築されているかについての詳細が得られるはずです。umbraco データ型を作成する3 つのクラス メソッドを使用したため、.ascx ファイルはなく、プログラムで要素をページにレンダリングする .cs ファイルだけです。

チェックボックスは、ノードのリストを反復処理し、次をレンダリングすることによってレンダリングされます。

<input type='checkbox' name='select_nodes' value='" + n.Id + "' />

次に、選択したノードのリストにノードを追加するためのボタンと、ノードを削除するためのボタンの 2 つのボタンをレンダリングします (ここでは追加を示しています)。このボタンは、ノード ID のカンマ区切りのリストを含む Form["select_nodes"] の値を取得し、それを個別のノードのリストに追加します。

ボタンは次のように追加されます。

public override void OnInit(EventArgs e)
{
    //Add Button
    btn_Add = new Button();
    btn_Add.CssClass = "btn_add";
    btn_Add.ID = "btnAdd" + Guid.NewGuid();
    btn_Add.Text = "Add >>";
    btn_Add.Click += new EventHandler(selectNodes);
    base.ContentTemplateContainer.Controls.Add(btn_Add);
}

上記では、このコントロールを基本的な形式で説明していますが、うまくいけば、セットアップについてもう少し洞察が得られます。

問題

このデータ型の複数のインスタンスを持つノードをロードすると、上記の例のように、重複するコントロール ID が原因でエラーが発生します。ID にランダムな GUID を追加することでこれを克服しました。現在の問題は、ノードを選択/選択解除するボタンが機能していないように見えることです。これらのボタンのインスタンスが複数あり、どのイベントを起動するか混乱しているためだと思いますか?

これを回避する方法はありますか?コントロールの複数のインスタンス間の干渉を避けるには?

ありがとう、

4

3 に答える 3

1

ここにあなたが役立つと思うかもしれないいくつかのリソースがあります:

于 2012-07-13T15:41:16.230 に答える
1

問題は、ページがポストバックされるたびにコントロールが再度生成され、毎回追加される Guid.NewGuid() のために異なる ID になることだと思います。ページがポストバックすると、クリックしたボタンのfindcontrolが実行され、そこからイベントハンドラーが取得されますが、ボタンのIDが変更された場合、それが見つからず、その後イベントハンドラーが見つかりません。

この種の状況を機能させる最善の方法は、ランダムな文字列を生成してコントロール名に追加するのではなく、ボタン作成のコンテキスト内で制御できる既知の定数を使用することです。したがって、リスト項目のボタンの場合は、毎回「li」を追加するか、そのようなものです。次に、すべてのポストバックで、コントロールが同じ名前を持っていることがわかりますが、それでも独自のインスタンスに固有です。

于 2012-07-13T23:30:04.713 に答える
0

成功

以下のコメントで@Infotekkaが指摘したように:

問題は、ページがポストバックされるたびにコントロールが再度生成され、毎回追加される Guid.NewGuid() のために異なる ID になることだと思います。ページがポストバックすると、クリックしたボタンのfindcontrolが実行され、そこからイベントハンドラーが取得されますが、ボタンのIDが変更された場合、それは見つからず、その後イベントハンドラーが見つかりません

これに応じて、次のように置き換えました。

btn_Add.ID = "btnAdd" + Guid.NewGuid();

btn_Add.ID = "btnAdd_" + targetDocType.ToLower();

上記の例に続いて、これにより、ID「btnAdd_Category」および「btnRemove_Category」の追加/削除ボタンを備えたこのコントロール/データタイプの 1 つのインスタンスが生成され、他のインスタンスでは ID「btnAdd_Author」および「btnRemove_Author」が生成されます。

最初はこれで問題は解決しませんでしたが、さらに調査したところ、埋め込まれた css を含めるためにページに追加していた LiteralControl があり、この ID もインスタンスごとに一意である必要がありました。

問題の根本を指摘してくれた @Infotekka と、リンクを提供してくれた @dludlow に感謝します。

@Infotekka、以前のコメントを回答として投稿すると、回答としてマークできます:)

于 2012-07-13T18:54:35.290 に答える