2010-12-14 18 views
1

私は、その有効プロパティ私は(含むページのコードビハインドから)別のクラスを使用して評価する必要がAsp.NetのTextBoxコントロールを持っています。私はこれをしたいの方法は次のとおりです。外部メソッド呼び出しのサーバーコントロールへの自己参照を含めるにはどうすればよいですか?

<asp:TextBox ID="myTB" runat="server" Enabled="<% ToggleControl(this, "someBusinessValue") %>" ... /> 

私は、呼び出し元のコントロールへの参照を渡す必要がある理由は、私はそれを無効にする前に検討する必要があるかもしれない他のプロパティがあるかどうかを確認することです。ただし、 'this'キーワードはページ全体を指します。私のTextBoxがFormViewコントロール、またはGridViewコントロール内とすることができるので、私は簡単に単に「page.myTB」を調べることによって制御を取得することはできません。私は、TextBoxへの参照を取得するためだけに、受け取り側のクラスファイルでGridViewsを実行する必要はありません。

誰もがこのように制御インラインを参照する方法を知っていますか?

EDIT 1:これは、サーバーコントロールのいくつかの異なるタイプに行う必要があります、などのListBox、チェックボックス、RadioButtonListの、など

EDIT 2:私が思い付くした最高あまりエレガントではありません

<asp:TextBox ID="myTB" runat="server" Enabled="<% ToggleControl(myGridView.FindControl("myTB") as WebControl, "someBusinessValue") %>" 

が、それは私が必要とするオートリファレンスを与えて行います。これまでのところです。

+0

は実際に興味深いジレンマを厥。通常、私はいくつかのロジックを持って私のコントロールが必要なときには、自分自身のロジックを含む独自の特別なTextBoxにサブクラス化します。結局のところ、物事は何ですか? –

+0

通常はそうしますが、必要な振る舞いはすべての入力コントロールに適用できるので、存在する各入力コントロールをサブクラス化する必要はありません(また、これを行うには新しいものも必要です)。 ウェブコントロールアダプターの使用を検討していましたが、もう少し複雑です。 –

答えて

0

任意のコントロールを派生し、 "AuthExpression"のような新しいプロパティを追加し、DataBinder.Evalメソッドで評価できるデータバインディング式を使用できます。

または、任意のコントロールに対してこのジョブを実行するASP.NET AJAXエクステンダコントロールを作成することができます。エクステンダによって拡張されたコントロールは、コントロールを有効または無効にする必要があると判断するデータバインディング式を返します。

私はこれがあなたの質問に答えている願っています!

1

私は、UI /データ/コードの分離の問題があると思います。

データソースのラッパーを作成して、バインドする前にすべてのデータを利用できるようにする必要があると思います。これは================================

を入れ子になったコントロールを発見することなど...避けることができます===================================================

他のオブジェクトにコントロールを渡すことは決してありません。その理由は、アプリケーションのUIを変更する必要がある場合、そのUI要素を参照しているすべてのものを再構築する必要があるからです。 - >ページ - オンORM /カスタムデータオブジェクトまたはコレクション - >オブジェクト/コレクションのインスタンス> UI

データソース(テーブル):

は、ここでそのデータを表示するための簡単な方法です。

あなたのUI idealalyは、ページ上のasp.net(Session/AppState/ViewState)によって提供される状態オブジェクトのいずれかに仮想的に保存され(パブリックまたは保護されたプロパティでラップされる) 。

UIの更新は、データソースが状態とデータソースに格納されているオブジェクト(System.Transaction.TransactionScopeを使用)を使用して伝播されるため、切断されたデータと同じになります故障の場合には優雅な劣化をもたらす。

ランタイム/その他のページでオブジェクト/コレクションのインスタンスにアクセスすると、パブリックプロパティまたは変数によってこの目的が容易になります。

このコンセプトでは、コントロールを渡す必要がなくなりました。データオブジェクトを消費するオブジェクト/ UI要素間でデータオブジェクトを前後に渡すだけで、代わりにアクションを実行します。

1

は、あなたの質問に答えるためにObserverパターンや単純な代表者を経由して他の人に宣伝することができる2つの以上のランタイムコンポーネント内部で発生

アップデート... ...

Enabled='<%# ToggleControl(FindControl("txtSomething") as WebControl,new SomeAssessor().EnabledWhenIdXyz) %>' 

あなたが使用することができ、この

public bool ToggleControl(WebControl control, Func<WebControl, bool> assessControl) 
{ 
    return assessControl(control); 
} 

そして、これはあなたが

を述べた別のクラスであるの背後に、コード内でヘルパーここ
public class SomeAssessor 
{ 
    public bool EnabledWhenIdXyz(WebControl control) 
    { 
     return control.ID == "txtSomething2"; 
    } 
} 

代わりに行うことが示唆アイデアです: あなたのGridViewのためのデータソースからIEnumerable<SomeModel>を返されている場合があります。 SomeViewModelオブジェクトは、元のデータをコントロールに必要な正確な「シェイプ」に変換します。

public class SomeModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class SomeViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Enabled { get; set; } 
} 

モデルをビューに変換するマッパーを作成します。ここでは、有効な評価が行われます。

public interface IMapper<TModel, TViewModel> 
{ 
    TViewModel MapModelToView(TModel source); 
} 

public class SomeMapper : IMapper<IEnumerable<SomeModel>, IEnumerable<SomeViewModel>> 
{ 
    public IEnumerable<SomeViewModel> MapModelToView(IEnumerable<SomeModel> source) 
    { 
     return source.Select(x => new SomeViewModel 
             { 
              Id = x.Id, 
              Name = x.Name, 
              Enabled = true //call to your method and resolve 
             }); 
    } 
} 

その後、IEnumerable<SomeModel>としてデータを照会し、それをマップし、GridViewのデータソースとして使用IEnumerable<SomeViewModel>

次に、あなたのテキストボックスに、以下の評価を書き込むことができます。

Enabled='<%# Eval("Enabled")%>' 
関連する問題